【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");//zhangsan
        String 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人小突破!本人风格:先做再说。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

引入Minio

前置条件 官网:https://www.minio.org.cn/download.shtml#/kubernetes 命令 # 查看系统上的网络连接和监听端口信息 netstat -tpnl # 检查系统的指定端口占用情况 sudo netstat -tuln | grep 9000systemctl status firewalld # 临时关闭 systemctl stop firewall…

计算机的存储体系与性能,存储黑科技大揭秘

计算机体系结构,其中存储分为内存与硬盘。内存,非持久化存储,临时存数,断电即失;硬盘,持久化存储,数据长存,即使断电也无忧。 计算机存储种类繁多,分为内部与外部两类。…

机器学习周记(第三十八周:语义分割)2024.5.6~2024.5.12

目录 摘要 ABSTRACT 1 DeeplabV3实现思路 预测部分 ①主干网络介绍​编辑 ② 加强特征提取结构 ③ 利用特征获得预测结果 摘要 本周继续了语义分割的学习,主要学习了DeepLabV3的部分实现思路,即DeepLabV3的整个模型的预测过程,并通过代…

Windows环境下编译 aom 源码详细过程

AV1 AV1是一种开源的视频编码格式,由开放媒体联盟(AOMedia Video 1,简称AOMedia或AOM)开发。AV1旨在提供比现有的视频编码格式如H.264和H.265更好的压缩效率,同时保持或提高视频质量。AV1的编码效率显著高于H.264&…

Xilinx 千兆以太网TEMAC IP核 MDIO 配置及物理接口

基于AXI4-Lite接口可以访问MDIO(Management Data Input/Output)接口,而MDIO接口连接MAC外部的PHY芯片,用户可通过AXI4-Lite接口实现对PHY芯片的配置。 1 MDIO接口简介 开放系统互连模型OSI的最低两层分别是数据链路层和物理层,数据链路层的…

【PHP【实战版】系统性学习】——登录注册页面的教程,让编写PHP注册变成一个简单的事情

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

Unity编辑器如何多开同一个项目?

在联网游戏的开发过程中,多开客户端进行联调是再常见不过的需求。但是Unity并不支持编辑器多开同一个项目,每次都得项目打个包(耗时2分钟以上),然后编辑器开一个进程,exe 再开一个,真的有够XX的。o(╥﹏╥)o没错&#…

如何利用ChatGPT辅助下处理:ENVI、GEE、Python等遥感数据

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用,人工智…

重卡生产流程的可视化管理与优化

重卡车间可视化是一个将车间内部生产流程、设备状态及人员配置直观展现的技术手段,确保制造过程的每个环节都在最优状态下运行。 在重卡制造领域,从底盘组装、车身焊接、涂装到最终的总装和检验,每一个工作过程都至关重要,对于保…

web入门——导航栏

本专栏内容代码来自《响应式web&#xff08;HTML5CSS3Bootstrap&#xff09;》教材。 导航栏 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&…

基于springboot的代驾管理系统的设计与实现

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

DI-engine强化学习入门(七)如何自定义神经网络模型

在强化学习中,需要根据决策问题和策略选择合适的神经网络。DI-engine中,神经网络模型可以通过两种方式指定: 使用配置文件中的cfg.policy.model自动生成默认模型。这种方式下,可以在配置文件中指定神经网络的类型(MLP、CNN等)以及超参数(隐层大小、激活函数等),DI-engine会根据…

https://是怎么实现的?

默认的网站建设好后都是http访问模式&#xff0c;这种模式对于纯内容类型的网站来说&#xff0c;没有什么问题&#xff0c;但如果受到中间网络劫持会让网站轻易的跳转钓鱼网站&#xff0c;为避免这种情况下发生&#xff0c;所以传统的网站改为https协议&#xff0c;这种协议自己…

文本检测模型 DBNet 一种基于分割算法的模型 对每个像素点进行自适应二值化,并将二值化过程与网络训练相结合 可微分二值化模块 概率图

文本检测模型 DBNet DBNet文本检测模型是一种基于分割算法的模型,其优化之处在于对每个像素点进行自适应二值化,并将二值化过程与网络训练相结合。 传统的文本检测方法通常将二值化作为一个后处理步骤,与网络训练分开进行。而DBNet则提出了一种可微分的二值化方法,即将文…

常见的几种物联网无线组网技术——青创智通

工业物联网解决方案-工业IOT-青创智通 随着物联网技术的不断发展&#xff0c;无线组网技术成为了物联网中不可或缺的一部分。无线组网技术可以使得各种设备之间无需通过有线连接即可进行数据传输和通信&#xff0c;从而提高了设备的灵活性和可扩展性。下面将介绍几种常见的物联…

行业分析---马斯克的Tesla

1 背景 在前面的博文《行业分析---我眼中的Apple Inc.》中&#xff0c;笔者曾介绍过苹果公司的财报和商业。依然本着提升自己看公司的能力&#xff0c;尝试去分析相对熟悉的公司&#xff0c;看懂它的商业。在之前的博客《自动驾驶---Tesla之FSD简介》中&#xff0c;笔者也简单介…

c++父类指针指向子类

有一个常见的c题&#xff0c;就是父类和子类的构造函数和析构函数分别调用顺序&#xff1a; 父类构造函数子类构造函数子类析构函数父类析构函数 以及父类中的函数在子类中重新实现后&#xff0c;父类指针指向子类后&#xff0c;该指针调用的函数是父类中的还是子类中的&…

Doris【部署 01】Linux部署MPP数据库Doris稳定版(下载+安装+连接+测试)

本次安装测试的为稳定版2.0.8官方文档 https://doris.apache.org/zh-CN/docs/2.0/get-starting/quick-start 这个简短的指南将告诉你如何下载 Doris 最新稳定版本&#xff0c;在单节点上安装并运行它&#xff0c;包括创建数据库、数据表、导入数据及查询等。 Linux部署稳定版Do…

简易留言板

目录 前端实现 数据库的使用 创建数据表 创建项目 连接数据库 后端实现 接口定义 持久层 业务逻辑层 控制层 前端代码完善 留言板是一个常见的功能&#xff0c;在本篇文章中&#xff0c;将实现一个简易的留言板&#xff1a; 页面中能够显示所有留言内容&#xff0c…

AI应用案例:新闻文本分类

随着科学技术的不断发展&#xff0c;互联网技术得以快速的发展和普及&#xff0c;并已在各行各业得到了广泛的应用&#xff0c;从中致使了网络上的信息呈现出爆炸式的增长状态&#xff0c;达到了“足不出户&#xff0c;万事皆知”的境况&#xff0c;充分体现了互联网新闻给生活…