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

news2024/11/24 18:38:30

目录

🚩本章目标

 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人小突破!本人风格:先做再说。

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

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

相关文章

Electron学习笔记(五)

文章目录 相关笔记笔记说明 七、系统1、系统对话框2、自定义窗口菜单3、系统右键菜单4、快捷键(1)、监听网页按键事件 (窗口需处于激活状态)(2)、监听全局按键事件 (窗口无需处于激活状态)(3)、补充:自定义窗口菜单快捷…

Three.js基础练习——渲染一个立方体

1.学习内容参考了 three.js入门教程--零基础也能学会_threejs菜鸟教程-CSDN博客 本章内容包含渲染立方体,并配合ui工具食用~ 2.效果图 import * as THREE from three import * as dat from dat.gui import { OrbitControls } from three/addons/controls/OrbitC…

【网站项目】SpringBoot803房屋租赁管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

【Golang】VSCode进行GO的调试

原来的launch.json {"version": "0.2.0","configurations": [{"name": "Golang","type": "go","request": "launch","program": "${workspaceFolder}","…

Linux技术---部署PXE服务器实现批量安装操作系统

部署PXE服务器实现批量安装操作系统 部署PXE服务器实现批量安装操作系统 部署PXE服务器实现批量安装操作系统1.安装相关服务组件1.1 安装tftp和xinetd1.2 安装DHCP服务1.3 准备 Linux 内核、初始化镜像文件、 PXE 引导程序、安装FTP服务并准备安装源1.4 配置启动菜单文件1.5 验…

JVM之运行时数据区

Java虚拟机在运行时管理的内存区域被称为运行时数据区。 程序计数器: 也叫pc寄存器,每个线程会通过程序计数器记录当前要执行的字节码指令的地址。程序计数器在运行时是不会发生内存溢出的,因为每个线程只存储一个固定长度的内存地址。 JAVA虚…

[蓝桥杯 2021 国 ABC] 123(java)——前缀和,思维

目录 题目 解析 代码 这么久了,我终于能不看别人代码完整写出来了,呜呜呜。虽然过程也是很曲折。 题目 解析 这个题,找其中数列的规律,1,1,2,1,2,3,1,2,3,4,...,因此我们把拆分成行列,如下…

Qt---信号和槽

一、信号和槽机制 所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号…

车载测试和传统测试有什么区别

搞清楚车载测试和传统应用测试的区别,就可以大胆冲冲冲! 车载测试随着市场的需求量增加又火来一波,一直’遥遥领先’的我们一定要告诉大家一个事实:车载测试和传统的应用测试是有很大区别的. 测试对象不一样 传统测试:测试的对象无非就是各种应用,比如电脑端的web系统(使用浏…

Git系列:git tag 使用技巧

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

FANUC机器人坐标系的分类和简介

1、概述 坐标系是为了确定机器人的位置和姿势而在机器人或空间上定义的位置指标系统,坐标系分为关节坐标系和直角坐标系,直角坐标系遵循右手定则,而关节坐标系则是以机器人每个轴所转动的角度来表示机器人当前的位置。 2、坐标系的分类及简…

weblogic 反序列化 CVE-2018-2628

这个漏洞因为java版本问题一直下载不了ysoserial反序列化工具,没办法生成payload。这里记录一下漏洞原理。 一、漏洞简介 Weblogic Server中的RMI 通信使用T3协议在Weblogic Server和其它Java程序(客户端或者其它Weblogic Server实例)之间传…

团结引擎+OpenHarmony 3 通信

团结引擎和鸿蒙之间通信 因为 ts 并没有像 JAVA 有反射的调用,所以我们必须要像 Web GL 平台一样通过导出的行为告诉引擎到底哪些 ts 的接口可以给 C# 来调用。 1 在 Tuanjie 引擎里 需要一个tsllib文件,用于设置给导出对象 C#使用。就可以直接创建以 …

Unity基础

概述 基础知识 3D教学 数学计算公共类Mathf 练习: 三角函数 练习: Unity中的坐标系 Vector3向量 向量模长和单位向量 向量加减乘除 练习: 向量点乘 向量叉乘 向量插值运算 Quaternion四元数 为何要使用四元数 四元数是什么 四元数常用方法 四元数计算 练…

GeoServer安装以及部署

GeoServer介绍 GeoServer是一个开源的服务器软件,用于共享和编辑地理空间数据。它支持多种地理空间数据格式,并且可以发布为多种服务格式,如Web Feature Service (WFS)、Web Map Service (WMS)、Web Coverage Service (WCS),以及…

十二、Redis主从复制

与其他的中间件存在同样的问题,在单机的情况,随着业务的增长,会面临着灾备、性能方面的压力。Redis在这方面提供了一主一从、一主多从的结构。这种结构同时也是实现读写分离功能的基础。即主节点提供写能力,从节点提供读能力。为了…

【C/C++】C/C++ 车票售票系统设计与实现(源码+课件)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

初识C语言——第十八天

循环while/do while while 语法结构 while(表达式) 循环语句; break:在while循环中,break用于永久的终止循环 continue:在while循环中,continue的作用是跳过本次循环continue后面的代码 直接去判断部分,看是否进行下一次循环。 注意事项…

射频识别技术RFID

射频识别技术RFID RFID介绍 射频识别: 英文名称是(Radio Frequency Identification), 简称是“ RFID” 又称 无线射频识别, RFID是物联网的其中一种终端技术。 RFID是一种通信技术, 可通过无线电讯号耦合识别特定目标并读写相关…

保研机试之【二叉树后序】--1道题

参考:东哥带你刷二叉树(后序篇) | labuladong 的算法笔记 建议先过一遍:今天是二叉树~-CSDN博客,very重要! 然后再过一遍(理解怎么应用方法):保研机试之[三道二叉树习题…