跟踪用户状态,http协议无状态 Cookie HttpSession,Session和Cookie的关系

1.概念分析

跟踪用户状态指的是web应用能够分辨请求属于哪个用户,进而记录用户的状态,从而为用户提供连续的针对性的服务。比如有多个客户在同一个购物网站上购物,每一个用户都会有一个虚拟的购物车。当某个客户发送请求将商品添加到购物车时,Web服务器必须能识别请求属于哪个用户,从而将商品添加该用户的购物车中

大多数的Web应用都需要跟踪用户状态,才能提供对应的服务。常见需要跟踪用户状态的应用:

  • 电子商务

  • 管理系统

也有一些简单的Web应用不需要跟踪用户状态。一些不需要跟踪用户状态的应用:

  • 门户新闻网站

  • 软件下载网站

2.http协议无状态

http协议是无状态的。每发起一次请求,就就创建一个新的连接,当结果响应结束后,连接就会被关闭。1个用户的多次请求和多个用户各发1次请求对于Web服务器而言是没有区别的。Web服务器无法根据连接分辨请求属于哪一个用户,http协议本身没有分辨用户,跟踪用户状态的功能。

解决方案:

  • Cookie

  • HttpSession

3 Cookie

Cookie 并不是它的原意“甜饼”的意思, 而是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性, 因此它可以帮助我们实现记录用户个人信息的功能 。

举例来说, 一个 Web 站点可能会为每一个访问者产生一个唯一的ID, 然后以 Cookie 文件的形式保存在每个用户的机器上。如果使用浏览器访问 Web, 会看到所有保存在硬盘上的 Cookie。在这个文件夹里每一个文件都是一个由“名/值”对组成的文本文件,另外还有一个文件保存有所有对应的 Web 站点的信息。在这里的每个 Cookie 文件都是一个简单而又普通的文本文件。透过文件名, 就可以看到是哪个 Web 站点在机器上放置了Cookie(当然站点信息在文件里也有保存) 。

所谓“cookie”数据是指某些网站为了辨别用户身份,储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。

通俗来讲就是指缓存数据,包括用户名、密码、注册账户、手机号等公民个人信息

3.1 设计思想

超市会员卡

特点:

  • 会员卡保存会员信息由超市生成并提供

  • 会员卡由顾客保存

  • 会员卡一般都会有有效期

  • 超市根据会员卡分辨识别用户

服务端生成包含用户信息的Cookie(键值对字符串),返回客户端。客户端再发起请求时,会自动携带Cookie到服务端,服务端可以获取Cookie,读取到用户信息从而识别用户。

特点:

  • Cookie由服务端生成

  • Cookie有client(浏览器)保存

  • Cookie都会有有效期

  • 服务端根据cookie分辨识别用户

3.2 技术细节

Cookie的使用,我们主要关注2点:服务端如何创建Cookie,以及如何从请求中获取Cookie?

Cookie有效期的设置:

/*Cookie有效期,默认等同于浏览器。(浏览器关闭,Cookie销毁)可以通过cookie.setMaxAge(存活时长)设置其有效期
*/ck.setMaxAge(60*60*24*7);//单位秒

手动添加Cookie

 //手动设置CookieCookie cookie = new Cookie("classId","202");Cookie cookie2 = new Cookie("school",URLEncoder.encode("郑大", "UTF-8"));cookie2.setMaxAge(60*60);response.addCookie(cookie);response.addCookie(cookie2);//获取Cookie       Cookie[] cookies = request.getCookies();PrintWriter out = response.getWriter();out.println("<html><body>");out.println("<h1> 账户:  "+ name +" <br/> 密码:"+ password +"   </h1>");for(Cookie cookie : cookies){String value = URLDecoder.decode(cookie.getValue(), "UTF-8");out.println("<h2> Cookie:  "+ cookie.getName() +" <br/> 值:"+ value +"   </h2>");}out.println("</body></html>");

Cookie的不足:

  • 只能保存字符串数据

  • 不能直接保存中文字符(tomcat8.5之后可以直接保存)

  • Cookie保存数据量有限,最多4K

  • Cookie不安全

Cookie的最佳实践:使用Cookie保存少量的不重要的数据,比如:浏览记录,用户名

4.HttpSession

HttpSession会话,表示一个浏览器和服务端的多次交互过程。一个浏览器短时间内连续访问服务端始终对应着同一个HttpSession对象.

4.1设计思想

HttpSession对象就好像生活中宾馆的一个房间。一个住客在一个宾馆中居住的日子里始终居住在同一个房间。

特点:

  • 房间由宾馆分配

  • 房间由宾馆管理

  • 每一个房间都会有使用时限

  • 宾馆根据房间和住客的对应关系分辨识别住客

HttpSession对象是由服务端创建的对象,占据服务器的一小块内存空间。一个浏览器(好比住客)多次访问服务端(好比宾馆)始终对应着同1个Session对象。服务端可以根据Session对象分别不同用户。

特点:

  • session由服务端创建

  • session保存在服务端,会占用服务器内存空间

  • session都会有默认的存活时长:距上一次访问30分钟

  • 服务端根据session分辨识别用户,session和浏览器是一一对应的关系。

4.2 技术细节

HttpSession的创建和获取

无论何时获取Session,代码都是:req.getSession(); 如果是第1次获取服务器会新建一个Session,如果之前获取过则直接返回Session。

设置session

/*** 使用session共享数据*/
@WebServlet(name = "s1", value = "/s1")
public class SessionDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {//使用session共享数据//1.获取sessionHttpSession session = req.getSession();//2.存储数据session.setAttribute("name", "苍老师");}}

获取session

@WebServlet(name = "s2", value = "/s2")
public class SessionDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {//使用session获取数据//1.获取sessionHttpSession session = req.getSession();//2.获取数据Object msg = session.getAttribute("name");System.out.println(msg);}

4.3 HttpSession作用域对象的使用

HttpSession本身还可以保存、获取数据,也就是可以当做作用域对象使用。因为同1个浏览器的多次请求获取到的是同1个Session,也就可以借助Session作用域在一个浏览器的多次请求间传递数据.

request和session作用范围:

  • request作用域的范围:在一次请求中

  • session的作用域范围:在一个浏览器的多次请求间

4.4 session存活时长的设置

session默认存活时长:距上一次访问30分钟

1. 修改tomcat/conf/web.xml :作用于整个tomcat中所有的应用

<session-config><!-- 单位:分钟 --><session-timeout>30</session-timeout>
</session-config>

2.修改当前web应用的web.xml: 作用于当前web应用

<session-config><!-- 单位:分钟 --><session-timeout>10</session-timeout>
</session-config>

3.修改某一个session的存活时长:只作用于特定的session对象

HttpSession session = req.getSession();
session.setMaxInActiveInterval(60);//单位秒

4.5 session对象的销毁

  1. 自然死亡:距最近调用时间超过设置值

  2. 主动消亡:session.invalidate();

4.6 Session的典型应用

强制登录

LoginController

@WebServlet("/login")
public class LoginController extends HttpServlet{@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1 收参req.setCharacterEncoding("utf-8");String username = req.getParameter("username");String pwd = req.getParameter("pwd");//2 调用业务层方法//3 跳转UserService userService = new UserServiceImpl();if(userService.login(username,pwd)){HttpSession session = req.getSession();session.setAttribute("login",true);resp.sendRedirect("/servlet-day02/person/showPersons");return;}resp.sendRedirect("/servlet-day02/login.html");}
}

ShowAllPersonsController

@WebServlet("/person/showPersons")
public class ShowPersonsController extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 强制登录判断HttpSession session = req.getSession();//从作用域中获取登录标识,如果获取不到说明没有登录,则重定向到登录页面Object login = session.getAttribute("login");if(login == null){resp.sendRedirect("/servlet-day02/login.html");return;}// 1 收参(省略)//2 调用业务层方法PersonService personService = new PersonServiceImpl();List<Person> persons = personService.listPersons();//借助request作用域传递数据req.setAttribute("persons",persons);//请求转发到showPersonsViewreq.getRequestDispatcher("/person/showPersonsView").forward(req,resp);}
}

5.Session和Cookie的关系

Session和Cookie都可以用来实现跟踪用户状态,而二者是关系的:Session的实现依赖于Cookie。

Session的底层原理:

  1. 当client(浏览器)第1次发起请求并获取session后,服务端在服务器内部创建一个Session对象,并将该session的id以(JSESSIONID=id值)的cookie写回浏览器

  2. 当client(浏览器)二次请求时,会自动携带Cookie(也就是JSESSIONID),服务端根据cookie记录的id值获取相应的Session

6.Cookie与Session的区别

6.1存储位置不同

cookie:是针对每个网站的信息,保存在客户端.

session:是针对每个用户的,Session中主要保存用户的登录信息,保存在服务器端.

6.2存储数据大小不同

cookie:一个 cookie存储的数据不超过4K。

session:session存储在服务器上可以任意存储数据, 无大小限制.

6.3 生命周期不同

cookie:cookie可以主动设置生命周期。还可以通过浏览器工具清除.

session:session的生命周期是间隔的,从创建时开始计时如在30min内没有访问session,那么session生命周期就被销毁。

6.4 数据类型不同

cookie:value只能是字符串类型。

session:value是object类型。

6.5 安全性不同

cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗.

考虑到安全应当使用session。

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

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

相关文章

初学Qt之环境安装与 hello word

环境&#xff1a; Qt Creator 4.11.0 (Community) Qt 5.14.0 目录 1.Qt环境配置 1.1 下载Qt 5.14.0 1.2 注册Qt账号 1.3 安装Qt 1.4 配置环境变量 2.创建项目 2.1 创建一个项目 2.2 初始代码解析 2.3 可视化GUI ​编辑 2.4 hello word 2.4.1 可视化hello word …

Spring Boot知识管理系统:创新与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

公开课学习:软件测试面试3大难题

1.验证码机制的处理&#xff1a;自动化遇到验证码怎么办?怎么测试? 流程&#xff1a;先识别元素&#xff0c;再对元素进行操作。实际上&#xff0c;验证码无法用自动化技术操作解决&#xff0c;都是由开发给万能码&#xff0c;或者屏蔽验证码去解决&#xff01;那如果不能屏…

数据结构——优先级队列(堆)

概念&#xff1a; 在操作数据的时候&#xff0c;操作的数据具有优先级&#xff0c;需要返回最高级别的优先级数据或者添加新对象时就需要用到优先级队列。 jdk1.8中的PrioriytQueue底层实现了堆这种数据结构实际上&#xff0c;堆其实就是在完全二叉树进行调整而来。 堆&#x…

C++STL--------vector

文章目录 一、vector常用接口介绍1、initializer_list2、接口有很多类似3、typeid(类型).name()4、find() 函数5、内置类型构造 二、vector()常用接口模拟实现 截图来源网站&#xff1a;https://legacy.cplusplus.com/reference/vector/vector/ 一、vector常用接口介绍 是一个…

哪种护眼大路灯孩子用着最好?公认最好的护眼大路灯

哪种护眼大路灯孩子用着最好&#xff1f;最近也有不少家长关注到了孩子视力健康的这个情况&#xff0c;很着急开始寻找各种能够减少孩子因为不良光线影响视力健康的方法&#xff0c;其中大路灯以良好的表现成为家长们的首选&#xff0c;但快速发展的市场中&#xff0c;却涌入了…

【C】C语言常见概念~

C语言常见概念 转义字符 转义字符&#xff0c;顾名思义&#xff0c;转变原来意思的字符 比如 #include <stdio.h> int main() {printf("abcndef");return 0; }输出的结果为&#xff1a; 将代码修改一下&#xff1a; #include <stdio.h> int main(…

双目视觉搭配YOLO实现3D测量

一、简介 双目&#xff08;Stereo Vision&#xff09;技术是一种利用两个相机来模拟人眼视觉的技术。通过对两个相机获取到的图像进行分析和匹配&#xff0c;可以计算出物体的深度信息。双目技术可以实现物体的三维重建、距离测量、运动分析等应用。 双目技术的原理是通过两…

SpringBoot基础(五):集成JUnit5

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 SpringBoot基础(二)&#xff1a;配置文件详解 SpringBoot基础(三)&#xff1a;Logback日志 SpringBoot基础(四)&#xff1a;bean的多种加载方式 SpringBoot基础(五)&#xff1a;集成JUnit5 目录 一、JUnit…

AIGC毕设项目分享:基于RAG的数字人对话系统及其应用

本研究的主要目标是设计并实现一个基于检索增强生成&#xff08;RAG&#xff09;技术的数字人对话系统&#xff0c;旨在提升数字人系统在多轮对话中的上下文管理、情境感知能力以及动态内容生成效果。系统结合了深度学习中的最新大语言模型技术&#xff0c;通过引入RAG框架来增…

K8S配置MySQL主从自动水平扩展

前提环境 操作系统Ubuntu 22.04 K8S 1.28.2集群&#xff08;1个master2个node&#xff09; MySQL 5.7.44部署在K8S的主从集群 metrics-server v0.6.4 概念简介 在K8s中扩缩容分为两种 ●Node层面&#xff1a;对K8s物理节点扩容和缩容&#xff0c;根据业务规模实现物理节点自动扩…

爬虫案例——网易新闻数据的爬取

案例需求&#xff1a; 1.爬取该新闻网站——&#xff08;网易新闻&#xff09;的数据&#xff0c;包括标题和链接 2.爬取所有数据&#xff08;翻页参数&#xff09; 3.利用jsonpath解析数据 分析&#xff1a; 该网站属于异步加载网站——直接网页中拿不到&#xff0c;需要…

MySQL-08.DDL-表结构操作-创建-案例

一.MySQL创建表的方式 1.首先根据需求文档定义出原型字段&#xff0c;即从需求文档中可以直接设计出来的字段 2.再在原型字段的基础上加上一些基础字段&#xff0c;构成整个表结构的设计 我们采用基于图形化界面的方式来创建表结构 二.案例 原型字段 各字段设计如下&…

深入理解线性表--顺序表

目录 顺序表- Seqlist -> sequence 顺序 list 表 顺序表的概念 问题与解答 顺序表的分类 静态顺序表 动态顺序表 问题与解答(递进式) 动态顺序表的实现 尾插 头插 尾删 头删 指定位置插入 指定位置删除 销毁 总结 前言&#xff1a;线性表是具有相同特性的一类数据结构…

2024 年 04 月编程语言排行榜,PHP 排名创新低?

编程语言的流行度总是变化莫测&#xff0c;每个月的排行榜都揭示着新的趋势。2024年4月的编程语言排行榜揭示了一个引人关注的现象&#xff1a;PHP的排名再次下滑&#xff0c;创下了历史新低。这种变化对于PHP开发者和整个技术社区来说&#xff0c;意味着什么呢&#xff1f; P…

现代数字信号处理I-P3 MVUE学习笔记

目录 1. 参数估计问题的提出与本质 2. 估计的性质 2.1 Ancillary&#xff08;多余估计&#xff09; 例1&#xff0c;Ancillary估计量 2. Uniformly Optimal 3. Sufficiency充分性 3.1 统计量充分性定义 例2&#xff1a;利用充分统计量定义获取伯努利分布的充分统计量 …

Anaroute - 理论学习(一)

一、贡献&#xff1a; 框架能够在考虑特定约束的同时&#xff0c;高效地完成复杂AMS设计的布线&#xff0c;并实现签署质量的性能。 提出了一种对称性约束的分配算法&#xff0c;根据引脚位置分配合适的网络匹配要求新的引脚聚类策略&#xff0c;以实现规律性的布线模式&…

微知-Bluefield DPU使用flint烧录固件报错MFE_NO_FLASH_DETECTED是什么?MFE是什么?

文章目录 背景一些报错场景MFE是什么&#xff1f;有哪些MFE 背景 在DPU的fw操作flint的时候&#xff0c;很多命令都会报这个错误&#xff1a;MFE_NO_FLASH_DETECTED&#xff0c;早期很疑惑并且猜测MFE是Mellanox Firmware Engine。实际并不是&#xff0c;具体还得走到mellanox…

2014年国赛高教杯数学建模B题创意平板折叠桌解题全过程文档及程序

2014年国赛高教杯数学建模 B题 创意平板折叠桌 某公司生产一种可折叠的桌子&#xff0c;桌面呈圆形&#xff0c;桌腿随着铰链的活动可以平摊成一张平板&#xff08;如图1-2所示&#xff09;。桌腿由若干根木条组成&#xff0c;分成两组&#xff0c;每组各用一根钢筋将木条连接…

2024 第一次周赛

A: 题目大意 骑士每连续 i 天每天会得到 i 个金币&#xff0c;&#xff08;i 1&#xff0c; 2&#xff0c; 3 &#xff0c; …&#xff09;,那么展开看每一天可以得到的金币数&#xff1a;1 2 2 3 3 3 4 4 4 5 5 5 5 5 … 可以发现就是1个1 &#xff0c;2个2, 3个3…,那么我…