会话跟踪技术基础:Cookie和Session

久违了,之前忙碌了一周赶毕设,今天抽空更新~ 

一.理论知识

1.会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应~

2.会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求之间共享数据~ 

        需要注意的是,HTTP请求协议是无状态的(为了保证每次请求的速度不慢),每次浏览器向服务器发送请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据的共享~

二.Cookie客户端会话跟总监技术

1.使用

如上图,Cookie是客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。


 在某个Servlet中,首先创建Cookie对象:

Cookie cookie = new Cookie("username","Jsl");

然后调用Response对象发送Cookie对象,再添加一些提示符:

resp.addCookie(cookie);
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("使用成功~");

运行Tomcat并访问Servlet:

Chrome浏览器中查看数据:

 Cookie已经被保存。

再新建另一个Servlet:

获取Cookie数组:

Cookie[] cookies = req.getCookies();

写下面一段循环:目的是获取上面咱们自定义的Cookie数据:

for(Cookie cookie:cookies){String name=cookie.getName();if("username".equals(name)){String value = cookie.getValue();resp.setContentType("text/html;charset=utf-8");resp.getWriter().write(name+":"+value);}}

重新启动Tomcat并访问AServlet:

再访问BServlet:获取成功!

以上即为一次会话两次请求之间共享数据的经典案例~ 

2.原理

        Cookie的实现是基于Http协议的。 在发送数据的时候使用set-Cookie响应头将数据发送到浏览器的内存中,而获取数据的时候使用cookie请求头来获取到cookie的数据。

3.生命周期

默认情况下,Cookie由于存储在浏览器内存中,当浏览器关闭时内存释放,Cookie即会被销毁~

setMaxAge(int seconds):设置Cookie存活时间:

  • 正数:将Cookie写入浏览器所存在电脑的硬盘,持久化存储,到时间即自动删除
  • 负数:默认值,浏览器关闭则会将Cookie销毁
  • 零:删除Cookie

4.设置中文

Cookie不能直接存储中文,需要进行URL转码。


创建对象时先编码:

        String name="拜仁慕尼黑~";URLEncoder.encode(name);Cookie cookie=new Cookie("name",name);resp.addCookie(cookie);resp.setContentType("text/html;charset=utf-8");resp.getWriter().write("使用成功~");

获取时再解码:

Cookie[] cookies = req.getCookies();for(Cookie cookie:cookies){String name=cookie.getName();if("name".equals(name)){String value = cookie.getValue();value= URLDecoder.decode(value);resp.setContentType("text/html;charset=utf-8");resp.getWriter().write(name+":"+value);}}

如下,中文汉字的数据亦可成功存储到cookie之中~

三.Session服务器会话跟总监技术

1.使用

        Session即服务端会话跟踪技术:将数据保存到服务端~JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能~ 


获取Session对象并传入值:

HttpSession session = req.getSession();
session.setAttribute("name","jsl");

在另一个Servlet中获取Session对象的数据:

        HttpSession session=req.getSession();Object name=session.getAttribute("name");System.out.println(name);

分别访问C和D两个Servlet后控制台成功输出:

2.原理 

 Session基于Cookie实现:

如上,在一次会话中,多次请求之间的Cookie是同一个值~ 

        本质还是将Session的唯一标识id作为Cookie值在多次请求之间共享:通过响应头获取id,再将id通过请求头传输给别的请求~

3.钝化、活化

服务器重启后,Session中的数据还存在~

  • 钝化:在服务器正常关闭之后,Tomcat会自动将Session数据写入硬盘的文件中~
  • 活化:再次启动服务器后,从文件中加载数据到Session中~

Session数据想共享,浏览器一定不能关闭~

4.销毁

  • 默认情况下无操作30分钟后会自动销毁~
  • 也可以使用invalidate()方法将自己销毁~

四.对比

服务器很难被攻破~) 

  • 购物车一般使用Cookie(长期存储~)
  • 偏好设置一般用Cookie(长期存储~)
  • 用户名展示一般用Session(安全保护~)
  • 需要一提的是,保存密码30天之类的功能,是一种不太安全的操作~
  • 验证码不能“不打自招”,必须使用Session~

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

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

相关文章

Python生成图片和音频验证码

captcha是pyhton的一个模块,用来生成图片和音频验证码。 安装 pip install captcha使用 from captcha.audio import AudioCaptcha from captcha.image import ImageCaptcha# 加载声音和字体 audio AudioCaptcha(voicedir/path/to/voices) image ImageCaptcha(…

StylizedGS: Controllable Stylization for 3D Gaussian Splatting

StylizedGS: Controllable Stylization for 3D Gaussian Splatting StylizedGS:3D高斯溅射的可控样式化 Dingxi Zhang, Zhuoxun Chen, Yu-Jie Yuan, Fang-Lue Zhang, Zhenliang He, Shiguang Shan, and Lin Gao1 张定西,陈卓勋,袁玉洁&#x…

vue3.4 新特性 defineModel() 宏

v-model 简介 官网是这样解释 v-model 的 v-model 的功能是&#xff0c;实现数据的双向绑定【本质上是 :value 和 input 语法糖】 如果是表单元素&#xff0c;下面两种写法是一样&#xff0c;这时v-model就是语法糖&#xff0c;帮你简化了操作 <input v-model"messag…

【MySQL】锁篇

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 本文封面由 凯楠&#x1f4f8;友情提供 目录 本系列专栏 1. MySQ 中的锁 2. 表锁和行锁 表锁 行锁 3. InnoDB 存储引擎的三种行级锁 4. 悲观锁…

文心一言 VS 讯飞星火 VS chatgpt (234)-- 算法导论17.2 2题

二、用核算法重做练习17.1-3。练习17.1-3的内容是&#xff1a;假定我们对一个数据结构执行一个由 n 个操作组成的操作序列&#xff0c;当 i 严格为 2 的幂时第 i 个操作的代价为 i &#xff0c;否则代价为1。使用聚合分析确定每个操作的摊还代价。 文心一言&#xff1a; 练习…

【树莓派初始化】教你从0开始搭建树莓派的使用环境

文章目录 前言1.什么是树莓派&#xff1f;1.1什么用户适合购买树莓派学习编程&#xff1f; 2.如何初始化一个树莓派2.1 烧录系统2.2 测试开机2.3 设置树莓派显示输出的分辨率2.4 网络链接2.5 Putty链接树莓派2.6 VNC链接树莓派2.7 使用filezilla软件传输文件到树莓派 3.使用Xsh…

实现创建线程的五种写法

创建线程的五种写法 1、通过继承Thread类并实现run方法创建一个线程package 创建线程;2、通过实现Runnable接口&#xff0c;并实现run方法的方法创建一个线程3、通过Thread匿名内部类创建一个线程4、通过Runnable匿名内部类创建一个线程5、通过Lambda表达式的方式创建一个线程 …

【OpenVINO™】使用 OpenVINO™ C# API 部署 YOLOv9 目标检测和实例分割模型(上篇)

YOLOv9模型是YOLO系列实时目标检测算法中的最新版本&#xff0c;代表着该系列在准确性、速度和效率方面的又一次重大飞跃。它通过引入先进的深度学习技术和创新的架构设计&#xff0c;如通用ELAN&#xff08;GELAN&#xff09;和可编程梯度信息&#xff08;PGI&#xff09;&…

AWS游戏全球智能翻译,助力企业出海

随着全球数字化时代的到来&#xff0c;游戏行业已经成为跨越国界、语言和文化的强大力量。然而&#xff0c;要将游戏产品成功推向全球市场并确保用户体验的流畅与愉悦&#xff0c;语言障碍却是一道不可忽视的挑战。在这个多元化的世界中&#xff0c;如何解决语言障碍&#xff0…

graylog使用Sidecars方式收集springboot程序的日志

1、部署graylog后台服务 使用docker-compose启动三个服务程序&#xff0c;包括graylog、mongodb、opensearch。 docker-compose.yml内容如下 version: 3 services: # MongoDB: https://hub.docker.com/_/mongo/ mongodb: image: mongo:6.0.14 privileged: true …

PS入门|如何让模糊的图片变得清晰?

前言 前段时间的PS入门讲的都是如何抠图、抠图、抠图。小白都快抠出三室一厅了&#xff0c;不知道学习的小伙伴如何了。 如果在学习过程中没有练习的照片&#xff0c;那直接使用每一篇文章的照片即可&#xff0c;学PS最忌讳的就是光看不练&#xff0c;眼睛会了&#xff0c;手…

Erlang中常用数据结构原理及其实现

文章目录 一、Erlang 简介二、数据结构2.1、元组&#xff08;Tuple&#xff09;2.1.1、示例&#xff1a;2.1.2、实现&#xff1a; 2.2、列表&#xff08;List&#xff09;2.2.1、示例2.2.2、实现2.2.3、原理 3. 字典&#xff08;Dictionary&#xff09;3.1、创建字典3.2、添加和…

FPGA基于VCU的H265视频压缩,HDMI2.0输入,支持4K60帧,提供工程源码+开发板+技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的视频图像编解码方案 3、详细设计方案设计框图FPGA开发板视频输入Video PHY ControllerHDMI 1.4/2.0 Receiver SubsystemVideo Processing SubsystemVideo Frame Buffer WriteZynq UltraScale VCUPetaLinux 系统制作VLC播放器工…

Collection与数据结构 二叉树(二):二叉树精选OJ面试题(上)

1. 判断是否为相同的二叉树 OJ链接 public boolean isSameTree(Node p, Node q) {if (p null && q ! null || p ! null && q null){//结构不同return false;}if (p null && q null){//结构相同,都是空树return true;}if (p.value ! q.value){//…

vector及cv::Mat删除指定元素并不改变位置

1、vector删除指定元素且不改变原有的顺序 使用erase方法&#xff0c;测试例子如下所示&#xff1a; //测试用例 struct MyStruct {int a;int b; }; std::vector<MyStruct> spotInfo; spotInfo.push_back({ 1,2 }); spotInfo.push_back({ 3,4 }); spotInfo.push_back({…

医疗器械UDI码的DI和PI什么意思

一、理解医疗器械UDI 医疗器械的UDI码是Unique Device Identifier Code的缩写&#xff0c;意为唯一设备识别码。 医疗器械的UDI码是唯一设备识别码&#xff0c;由两个部分组成&#xff1a;DI和PI。 1.1、DI 理解 DI&#xff08;Device Identifier&#xff0c;设备标识符&am…

电池二次利用走向可持续大循环周期的潜力和挑战(第三篇)

一、电池的梯级利用 电池梯级利用&#xff08;Battery Tiered Utilization&#xff09;是一种可持续发展的策略&#xff0c;指的是当电池在其最初的应用场景中不再能满足高性能需求时&#xff0c;通过检测、评估、重组等一系列技术手段&#xff0c;将这些电池转移到对性能要求…

JetBrains RubyMine 2024.1 发布 - 最智能的 Ruby 与 Rails IDE

JetBrains RubyMine 2024.1 发布 - 最智能的 Ruby 与 Rails IDE 请访问原文链接&#xff1a;JetBrains RubyMine 2024.1 (macOS, Linux, Windows) - 最智能的 Ruby 与 Rails IDE&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org…

MobX入门指南:快速上手状态管理库

一、什么是MobX MobX 是一个状态管理库&#xff0c;它可以让你轻松地管理应用程序的状态&#xff0c;并且可以扩展和维护。它使用观察者模式来自动传播你的状态的变化到你的 React 组件。 二、安装及配置 安装 MobX 和 MobX-React&#xff1a;你可以使用 npm 或 yarn 安装这…

DePIN打猎之旅:AI算力作饵,道阻且长

出品&#xff5c;OKG Research 作者&#xff5c;Hedy Bi 香港Web3嘉年华已告一段落&#xff0c;然而Web3自由的脉搏还在跳动&#xff0c;并不断向其他行业渗透。和上一轮周期相比&#xff0c;本轮牛市开启的逻辑是由“原生创新叙事”转变成“主流认可&#xff0c;资金驱动”的…