跟踪用户状态,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,一经查实,立即删除!

相关文章

使用 Netperf 工具进行 TCP 和 UDP 时延测试

测试目的 通过使用 Netperf 工具评估 TCP 和 UDP 协议的时延性能&#xff0c;分析不同 Payload 大小对时延的影响&#xff0c;为网络性能优化提供数据支持。 测试环境 - **硬件**&#xff1a; - 测试服务器&#xff08;运行 Netperf&#xff09; - CPU: 至少四核 …

基于Vue3+Ts+Vite项目中grpc-Web的应用以及其中的坑

背景&#xff1a; 最近项目中有一个需求&#xff1a;在新项目中使用grpc进行前后端通信。我便基于此需求开始了新的研究。 首先我是想抄作业的&#xff0c;但是翻了很多相关grpc-web的文章&#xff0c;写的都不是很详细&#xff0c;再涉及到grpc-web服务的升级迭代&#xff0…

初学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 …

线性回归-随机梯度法下降算法预测波士顿房价(附带数据集下载链接, 长期有效)

机器学习基本步骤: ​1.数据获取-导入外部数据集housing_price 数据获取: 听着高大上, 实际上就是把内部/外部数据集加载进来 2.数据基本处理-缺失值处理, 分割数据集, 数据基本处理:实际上就是对数据中缺失的数据和异常的数据进行处理, 然后进行数据集分割 3.特征工程-特…

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;却涌入了…

Golang 逃逸分析(Escape Analysis)理解与实践篇

Golang 逃逸分析&#xff08;Escape Analysis&#xff09;理解与实践篇 文章目录 1.逃逸分析2.相关知识&#xff08;栈、堆、GC分析&#xff09;3.逃逸分析综合-实践 demo 逃逸分析&#xff08;Escape Analysis&#xff09;是编译器在编译期进行的一项优化技术&#xff0c;是Gl…

Qt QTableWidget多行表头、表头折行显示

表头折行显示 //方法一QVector<QString> chNames;chNames<<"表头1"<<"表头2长命名abcdefg";ui.tableWidget->setColumnCount(chNames.size()1);ui.tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(QString::fromL…

【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…

敏捷开发 与 Scrum

‌敏捷开发的概念起源于20世纪90年代末期&#xff0c;旨在解决传统软件开发方法中存在的效率低下问题。‌ 传统软件开发方法因其繁琐的过程和对文档的严格要求&#xff0c;导致了“重型化危机”&#xff0c;这使得开发效率大幅下降。为了应对这些问题&#xff0c;敏捷方法应运…

微信小程序 - 01 - 一些补充和注意点(补充ing...)

目录 一、节流二、在一个发请求的函数中&#xff0c;只有发生下拉动作&#xff0c;才执行关闭下拉代码 最近在学微信小程序&#xff0c;把学习过程中的一些补充和注意点总结一下&#xff0c;内容会比较简单&#xff0c;因为只涉及基础知识&#xff0c;供个人参考 一、节流 情…

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;根据业务规模实现物理节点自动扩…

Python列表专题:list与in

Python是一种强大的编程语言,其中列表(list)是最常用的数据结构之一。列表允许我们存储多个元素,并且可以方便地进行各种操作。在Python中,in运算符被广泛用于检测元素是否存在于列表中。本文将深入探讨Python列表及其与in运算符的结合使用。 1. Python列表的基础 1.1 什…

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

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