【JavaEE初阶系列】——Cookie和Session应用之实现登录页面

目录

🚩本章目标

 1.登录页面

2.servlet处理上述的登录请求 

3.网站主页(成功登录之后的页面)

🚩实现过程

🎓登录页面

🎓Servlet处理登录请求

🎈获取请求传来的参数(用户名和密码)

🎈验证密码是否正确

📝不同场景设置字符集 

🎓登录成功,创建会话

🎓实现登录后的主页

🎈获取当前用户对应会话对象

🎈查找到了后从会话中拿到存储的用户信息

🎈生成页面,显示数据到页面上

 🚩fidder抓包检验

🚩总结


我们这次主要体现Cookie和 Session应用在登录页面的体现。

🚩本章目标

 1.登录页面

发起一个http请求,触发登录逻辑(带上用户输入的用户名和密码)

2.servlet处理上述的登录请求 

通过这个servlet读取用户名和密码,并且验证是否登录成功

如果登录成功,就会给当前这个用户,创建一个会话(这个会话就存储了用户当前的信息),并且把得到的sessionId,通过cookie给客户端(客户端把cookie存储起来)

3.网站主页(成功登录之后的页面)

 在这个页面中,就会把刚才的用户数据据给显示在页面上,比如使用“张三”用户来登录,主页上就会显示,“欢迎你张三”这个标识。


🚩实现过程

🎓登录页面

此处预期发送的请求

POST login

Content-Type:application/x-www-form-urlencoded

(使用form表单,Content-Yype就是这个格式)此处的登录,使用json也不是不可以,使用json就无法使用form表单了(使用json就需要通过ajax的方式构造请求)

username=zhangsan&password=123

插一句:浏览器构造http请求,就几种方式

  • url输入地址(GET)
  • 特殊的html标签 a,img,script(GET)
  • form表单(GET,POST)
  • ajax(GET,POST,PUT,DELETE......)

🎓Servlet处理登录请求

🎈获取请求传来的参数(用户名和密码)

1.获取请求getParameter方法,来获取请求传来的参数(用户名和密码),但是我们最好先给请求设置一个字符集,否则如果username是中文,getParameter可能会乱码。

req.setCharacterEncoding("utf8");String username=req.getParameter("username");//zhangsanString password=req.getParameter("password");//123

🎈验证密码是否正确

2.验证用户名密码,是否是正确的,一般来说,验证用户名密码,是要通过数据库的

此处为了简单一点,先把用户名和密码,写死,比如此处假设正确的用户名是“zhangsan",正确的密码是123.

此处还要注意,上述getParameter可能会拿到null,为了避免空指针,下面的这种比较更合适的。

1.上一种如果先看看username是否为空,如果username为空,那么就会抛出空指针异常。

2.下面一种方式,就是看看"zhangsan"是不是和username相对应,如果不等于,就直接给 用户返回一个提示,提示之前要给返回的响应设置字符集,防止返回的提示是中文显示乱码。equals内部能够针对参数为null做好处理

if(!"zhangsan".equals(username) || !"123".equals(password)){//登录失败,给用户返回一个提示resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前的用户名或者密码错误");}

📝不同场景设置字符集 

显示在页面上设置字符集

 resp.setContentType("text/html; charset=utf8");

客户端传来的参数设置字符集

req.setCharacterEncoding("utf8");

🎈登录成功,创建会话

登录成功了,给这个用户创建会话也就是用到session,我们可以给会话中保存一些自定义的数据,通过Attribute的方式来保存。

      //3.登录成功了,给这个用户创建一个会话出来//可以给会话中保存一些自定义的数据,通过Attribute的方式来保存HttpSession session=req.getSession(true);//此处Attribute也是键值对,这里的内容存储什么都可以,程序员自定义//这样的数据存储了之后,后续跳转到其他页面,也随时可以把这个数据从会话中取出来session.setAttribute("username",username);session.setAttribute("loginTime",System.currentTimeMillis());//此时相当于登录成功了,让页面跳转到网站首页resp.sendRedirect("index");

我们看到

HttpSession session=req.getSession(true);

true参数就是允许在不存在时自动创建,参数为false不能创建,直接返回null

getSession这个方法,就是根据请求的cookie中的sessionId,查询服务器的hash表。找到对应的session对象,如果cookie中没有sessionId(首次登录的时候,就是没有的)或者sessionId没有查到对应的session对象,就可以创建出一个session对象出来。

会创建出一个sessionId和一个session对象,把这个键值对保存到hash表中,并且会把sessionId设置到响应中(响应报头中加上Set-Cookie字段),传回给浏览器,让浏览器使用Cookie来保存。


session.setAttribute("username",username);
session.setAttribute("loginTime",System.currentTimeMillis());

这里使用Attribute的作用,主要就是为了让一个数据,在多个Servlet之间共享,同时Attribute时会话级别的,每个用户/客户端都是有自己的数据,相互之间都不会有干扰的。

  • 如果这个servlet时通过第一个浏览器(sessionId_身份标识)调用的,此时Servlet里面拿到的就是zhangsan这个Session对象,及其里面的数据
  • 如果这个servlet是通过第二个浏览器(sessionId_身份标识)调用的,此时servlet里面拿到的就是lisi这个Session对象,及其里面的数据。

通过sessionId取会话对象(两个浏览器,sessionId不同)

同样的页面,不同用户看到的数据肯定是不同的,支付宝,就有查看资产页面,我访问这个页面,看到的数据,和码云爸爸访问这个页面,看到的数据,肯定是不相同的。


🎈跳转网站首页 

//此时相当于登录成功了,让页面跳转到网站首页
resp.sendRedirect("index");

重定向跳转到index页面上(后续会写一个Servlet生成这个页面)


🎓实现登录后的主页

🎈获取当前用户对应会话对象

     //1.先获取到当前用户对应的会话对象,生成的页面要根据当前用户信息来构造HttpSession session=req.getSession(false);if(session==null){//sessionId不存在,或者sessionId没有在hash表中查到resp.setContentType("text/html;charset=utf8");resp.getWriter().write("你当前未登录!");return;}

 根据cookie中的sessionId来查询Servlet这里的hash表,参数设置成false,如果查到了,就直接返回,没查到,就返回null。

会话,就可以理解成”用户身份信息“体现,在通过登录操作,验证了用户身份之后,才能够创建会话。其他页面,没有做”验证身份“,不应该创建会话。

getsession(false) 操作内部拿着sessionId来查询的,同一个SessionId(同一个cookie等同于同一个浏览器),就能拿到同一个session对象。

如果没有查到对应的session对象,那么就显示给客户端表示未登录。


🎈查找到了后从会话中拿到存储的用户信息

//2.从会话中拿到之前存储的用户信息
//此处的强转,需要程序员自行保证,类型是靠谱的
String username=(String) session.getAttribute("username");
Long loginTime=(Long)session.getAttribute("loginTime");

但是sessionId能区分到对应的session对象,查到对应的用户名和登录时间信息 。


🎈生成页面,显示数据到页面上

//3.生成一个页面,把上述数据显示到页面上
resp.setContentType("text/html; charset=utf8");
String respBody="欢迎您"+username+"! 上次登录时间为: "+loginTime;
resp.getWriter().write(respBody);

得到的结果是Object,存的时候,各种数据都可以存。


 🚩fidder抓包检验

📝点击登录之后就会触发一个POST请求 


📝服务器 

此处getSession会创建新会话

  • 1.生成sessionId和HttpSession对象
  • 2.把上述sessionId和HttpSession对象保存到内存hash表中
  • 3.把sessionId设置到响应报文的header中set-Cookie字段

JSESSIONID这个key是固定的,就叫做JSESSIONID(从更广义的概念上属于是sessionId)

后面一串数字,每个客户端都不同。

浏览器拿到响应,就会把这个Set-Cookie的内容保存到浏览器的Cookie中

  • key:JSESSIONID
  • value:

保存,就是为了后面再次访问服务器的时候,能够带上这个cookie


📝重定向到主页(index)

拿着JSESSIONID这里的数值,查询hash表,拿到刚才创建的session对象。(这个JSESSIONID就是身份标识)


📝总思路 


🚩总结

浏览器首次访问登录操作的时候,就会在服务器这边验证身份,验证通过,就会创建会话。服务器就会保存会话信息(hash),客户端也会保存身份标识(sessionID).后续浏览器再次访问这个网站(网站的其他页面)都会带上cookie(sessionId),服务器就不需要让浏览器重新登录,也能识别出浏览器的用户身份信息。

一个网站只要登录成功之后,后续访问这个网站的其他页面,也都是会处在一个登陆的状态,上述过程中都是可以借助cookie和session来完成的。


i人小突破!本人风格:先做再说。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一件事做了十年

目录 一、背景二、过程1.贫困山区的心理悲哀2.基础差的客观转变3.对于教育的思考4.持续做这件事在路上5.同行人有很早就完成的,有逐渐放弃的,你应该怎么办?6.回头看,什么才是最终留下的东西? 三、总结 一、背景 在哪里出生我们无…

《Linux运维总结:ARM64架构CPU基于docker-compose一离线部署rabbitmq 3.10.25容器版镜像模式集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统&…

【ubuntu】ubuntu-18.04开机卡在Starting User Manager for UID 120....问题解决方案

错误截图 解决方案 启动系统,开机界面单击按键esc键,注意需要将鼠标定位到菜单界面,移动键盘上下键选择Advanced options for Ubuntu 进入如下菜单,选择recovery mode 回车之后会弹出如下界面,选择如下root&#xff0…

超详细的胎教级Stable Diffusion使用教程(四)

这套课程分为五节课,会系统性的介绍sd的全部功能和实操案例,让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion,它究竟有多强大? 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

【C语言/Python】嵌入式常用数据滤波处理:卡尔曼滤波器的简易实现方式(Kalman Filter)

【C语言/Python】嵌入式常用数据滤波处理:卡尔曼滤波器的简易实现方式(Kalman Filter) 文章目录 卡尔曼滤波卡尔曼滤波公式卡尔曼滤波数据处理效果C语言的卡尔曼滤波实现附录:压缩字符串、大小端格式转换压缩字符串浮点数压缩Pack…

Spring-Cloud-OpenFeign源码解析-01-OpenFeign简介

OpenFeign简介 OpenFeign是一种声明式、模板化的HTTP客户端(仅在Application Client中使用)。声明式调用是指,就像调用本地方法一样调用远程方法,无需感知操作远程http请求。 OpenFeign和Feign的区别 Feign是Spring Cloud组件中一个轻量级RESTful的HT…

亚信安全发布《2024年第一季度网络安全威胁报告》

亚信安全2024年第一季度网络安全威胁报告 一季度威胁概览 《亚信安全2024年第一季度网络安全威胁报告》的发布旨在从一个全面的视角解析当前的网络安全威胁环境。此报告通过详尽梳理和总结2024年第一季度的网络攻击威胁,目的是提供一个准确和直观的终端威胁感知。…

LNMP环境部署WordPress——使用源码包安装方式部署环境

目录 一.前提准备 二.源码安装Mysql 1.MySQL类型 2.MySQL 版本说明 3.MySQL 安装方式 3.1 yum 安装 3.2 编译安装 3.3 二进制安装 3.4 rpm 安装 4. 编译安装MySQL5.7 4.1 清理安装环境 4.2 创建mysql用户 4.3 从官网下载tar包 4.4 安装编译工具 4.5 解压 4.6 …

【教学类-55-01】20240511图层顺序挑战(四格长条纸)(4*4)和“手工纸自制参考图”

作品展示 背景需求 空间思维图层挑战2|逻辑推理|空间想象力 - 小红书 (xiaohongshu.com)https://www.xiaohongshu.com/discovery/item/62cbf6c60000000010026aa0?app_platformandroid&ignoreEngagetrue&app_version8.35.0&share_from_user_hiddentrue&typevi…

Django项目运行报错:ModuleNotFoundError: No module named ‘MySQLdb‘

解决方法: 在__init__.py文件下,新增下面这段代码 import pymysql pymysql.install_as_MySQLdb() 注意:确保你的 python 有下载 pymysql 库,没有的话可以使用 pip install pymysql安装 原理:用pymysql来代替mysqlL…

探索人类意识的多样性:从安全感到语感、节奏感的差异

在我们的日常生活中,人类意识表现出多种多样的特点,这些特点往往与个体的天生禀赋和生活经历密切相关。从安全感到语感、节奏感,每个人的表现都有所不同。今天,让我们一起来探索这些差异,感受人类意识的多样性。 首先&…

stable diffusion WebUi本地安装

一、stable diffusion 介绍 Stable Diffusion是一种先进的文本到图像的生成模型,它可以根据给定的文本输入生成高度逼真的图像。 Stable Diffusion模型因其高效性和灵活性,在AI图像生成领域引起了广泛关注,并在实际应用中展示了其强大的能力…

论文盲审吐槽多,谁给盲审不负责的老师买单?如何看待浙江大学「一刀切」的研究生学位论文双盲评审制度?

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

day6Qt作业

人脸识别系统 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> #include<opencv2/face.hpp> #include <vector> #include <map> #include <QMessag…

美颜滤镜SDK解决方案,稳定可靠,易于集成

高质量的视觉体验已成为企业吸引用户、提升品牌形象的关键&#xff0c;美摄科技凭借其领先的美颜滤镜SDK技术&#xff0c;为企业提供了从人像美颜到多元场景处理的全方位解决方案&#xff0c;助力企业轻松实现视觉升级。 一、强大能力&#xff0c;覆盖多场景 美摄科技美颜滤镜…

MIPI DPHY HS传输模式SoT和EoT的传输值

目录 1. 高速传输模式的传输序列 2. SoT传输序列 3. EoT传输序列 1. 高速传输模式的传输序列 Mipi DPHY的高速数据传输&#xff08;HST&#xff1a;High Speed Transmission&#xff09;以突发&#xff08;Burst&#xff09;方式发生。 为了帮助接收机同步&#xff1a; (1) …

Vue3实战笔记(13)—pinia安装笔记

文章目录 前言安装和配置pinia总结 前言 Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。 Pinia是一个轻量级的状态管理库&#xff0c;它专注于提供一个简单的API来管理应用程序的状态。相比之下&#xff0c;Vuex是一个更完整的状态管理库&#xf…

现代制造之数控机床篇

现代制造 有现代技术支撑的制造业&#xff0c;即无论是制造还是服务行业&#xff0c;添了现代两个字不过是因为有了现代科学技术的支撑&#xff0c;如发达的通信方式&#xff0c;不断发展的互联网&#xff0c;信息化程度加强了&#xff0c;因此可以为这两个行业增加了不少优势…

【信号与槽机制】

信号与槽机制 &#x1f31f; 信号函数&#x1f31f; 槽函数&#x1f31f; 连接函数&#x1f338; QObejct::connect函数剖析&#x1f31f; 官方文档中给出的定义&#x1f31f;《Qt 5.9 C开发指南》中的定义 &#x1f31f; 信号函数 信号是一种特殊的成员函数&#xff0c;用于在…

2024数维杯数学建模C题思路代码

2024年数维杯&电工杯思路代码在线文档​https://www.kdocs.cn/l/cdlol5FlRAdE 这道题想要做出好的结果&#xff0c;必须要结合插值法和分布函数来做&#xff0c;主要还是因为勘探点太少&#xff0c;直接用插值法效果不太好&#xff0c;以下是我做的&#xff0c;函数分布可…