【JavaEE】Cookie和Session详解
一.Cookie
- 首先我们知道HTTP协议本身是’‘无状态’‘的, 这里的’‘无状态’'指的是:默认情况下HTTP协议的客户端和服务器之间的这次通信,和下次通信之间没有直接的联系. 但是在实际的开发过程之中, 我们很多时候是需要知道请求之间的关联关系的. 例如登陆网站成功后,第二次访问的时候服务器就能知道该请求是否是已经登录过了. 换句话说,假设你刚从浏览器上登录了你的LeetCode账号,然后把该页面关掉,一段时间之内你再次进入时就不需要再次输入账号密码了
- 用图表示上述过程就是:
- 上述途中的’‘令牌’'通常就存储在Cookie字段中.
- 举个例子:比如去医院挂号.
-
- 看病之前先挂号, 挂号的时候需要提供身份证证件, 此时你就获得了一张"就诊卡", 这个就诊卡就相当于患者的"令牌". 此时医院的系统之中就会存储你的身份信息.
-
- 后续去各个科室进行检查诊断,开药等操作, 都不比在出示身份证件了, 只要有就诊卡即可识别出当前患者的身份了.
-
- 看完病之后, 不想要就诊卡了, 就可以注销这个卡, 此时患者的身份就和就诊卡的关联就销毁了, 医院之中的系统就不会再记录这个数据了, 再次拿这个卡去看病就会不起作用了 (类似于网站的注销操作).
-
- 如果下次再来看病, 就需要再办一张就诊卡, 此时就相当于又获得一一张’‘令牌’’
-
- 举个例子:比如去医院挂号.
此时在服务器(医院)这边就需要记录"令牌"信息, 以及令牌对应的用户信息, 这个就是 Session 机制所做的工作.
二.Session
理解会话.
-
会话也是对话的意思.
-
在计算机领域, 会话是一个客户与服务器之间的不中断的请求响应. 对客户的每个请求,服务器能够识别出请求来自于同一个客户. 当一个未知的客户向Web应用程序发送第一个请求时就开始了一个会话. 当客户明确结束会话或服务器在一个时限内没有接受到客户的任何请求时,会话就结束了.
- 比如我们打客服电话. 每次打客服电话, 就是一个会话. 挂断电话, 会话就结束了
下次再打客服电话, 就又是一个新的会话. 如果我们长时间不说话, 没有新的请求, 会话也会结束.
- 比如我们打客服电话. 每次打客服电话, 就是一个会话. 挂断电话, 会话就结束了
-
服务器同⼀时刻收到的请求是很多的. 服务器需要清楚的区分每个请求是从属于哪个用户, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与用户的信息的对应关系.Session是服务器为了保存用户信息而创建的一个特殊的对象.
- Session的本质就是⼀个 “哈希表”, 存储了⼀些键值对结构. Key 就是SessionID, Value 就是用户信息(用户信息可以根据需求灵活设计).
SessionId
- ==SessionId 是由服务器生成的一个 “唯一性字符串”, 从 Session 机制的角度来看, 这个唯一性字符串称为 “SessionId”. 但是站在整个登录流程中看待, 也可以把这个唯一性字符串称为 “token”. ==上述例子中的令牌ID, 就可以看做是SessionId, 只不过令牌除了ID之外, 还会带一些其他信息, 比如时间, 签名等.
SessionId是如何产生的
- 当用户登陆的时候, 服务器在 Session 中新增一个新记录, 并把 sessionId返回给客户端. (通过HTTP 响应中的 Set-Cookie 字段返回).
- 客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过HTTP 请求中的Cookie 字段带上).
- 服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的用户信息, 再进行后续操作.找不到则重新创建Session, 并把SessionId返回.
注:
Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失.
三.Cookie 和 Session 的区别
- Cookie 是客户端保存用户信息的一种机制. Session 是服务器端保存用户信息的一种机制.
- Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁
- Cookie 和 Session 经常会在一起配合使用. 但是不是必须配合.
- 完全可以用Cookie 来保存⼀些数据在客户端. 这些数据不一定是用户身份信息, 也不一定是SessionId.
- Session 中的sessionId 也不需要非得通过 Cookie/Set-Cookie 传递, 比如通过URL传递.
四.Cookie的存储和读取
方法一:传统的获取Cookie的方式.
@RequestMapping("/getCookie1")public String getCookie(HttpServletRequest request, HttpServletResponse response) {//获取参数//String name = request.getParameter("name");Cookie[] cookies = request.getCookies();if (cookies != null) {Arrays.stream(cookies).forEach(cookie -> {System.out.println(cookie.getName()+":"+cookie.getValue());});}return "获取cookie成功";}
- Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的. HttpServletRequest , HttpServletResponse 是Servlet提供的两个类, 是Spring MVC方法的内置对象. 需要时直接在方法中添加声明即可.
- HttpServletRequest 对象代表客户端的请求, 当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息.
- HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, 比如向客户端发送的数据, 响应头, 状态码等. 通过这个对象提供的方法, 可以获得服务器响应的所有内容. Spring MVC在这两个对象的基础上进行了封装, 给我们提供更加简单的使用方法.
测试结果:
方法二:使用注解的方式获取Cookie.
@RequestMapping("/getCookie2")public String getCookie2(@CookieValue("bite") String result){return "获取到cookie值了,value:"+result;}
五.Session的存储和读取
1.Session存储
@RequestMapping("/setSession")public String setSession(HttpServletRequest request, HttpServletResponse response) {//先从cookie中获取到sessionId,再根据sessionId获取session对象,如果没有获取到,就会自己创建一个session对象HttpSession session = request.getSession();session.setAttribute("name","zhangsan");return "Session设置成功~~";}
这个代码中看不到 SessionId 这样的概念的. getSession 操作内部提取到请求中的Cookie 里的SessionId, 然后根据SessionId获取到对应的Session 对象, Session 对象用HttpSession来描述
2.Session读取.
方法一
@RequestMapping("/getSession1")public String getSession1(HttpServletRequest request, HttpServletResponse response) {//先从cookie中获取到sessionId,再根据sessionId获取session对象HttpSession session = request.getSession();String name = (String)session.getAttribute("name");return "获取到session的值了 name:"+name;}
- 通过fiddler观察请求的详细情况:
可以看到, HTTP响应中, 通过Set-Cookie告知客⼾端, 把SessionID存储在Cookie中 - 通过浏览器, 可以观察到运行结果:
通过Fiddler观察Http请求和响应
可以看到, Http请求时, 把SessionId通过Cookie传递到了服务器
方法二:
@RequestMapping("/getSession2")public String getSession2(HttpSession session, HttpServletResponse response) {String name = (String)session.getAttribute("name");return "获取到session的值了 name:"+name;}
方法三:
@RequestMapping("/getSession3")public String getSession3(@SessionAttribute("name") String name) {//String name = (String)session.getAttribute("name");return "获取到session的值了 name:"+name;}
六.总结.
- Cookie 和Session都是会话机制, Cookie是客⼾端机制, Session是服务端机制. ⼆者通过SessionId来关联.
- Spring MVC内置HttpServletRequest, HttpServletResponse两个对象. 需要使用时, 直接在方法中添加对应参数即可, Cookie和Session可以从HttpServletRequest中来获取, 也可以直接使用HttpServletResponse设置HTTP响应状态码
相关文章:

【JavaEE】Cookie和Session详解
一.Cookie 首先我们知道HTTP协议本身是’‘无状态’‘的, 这里的’‘无状态’指的是:默认情况下HTTP协议的客户端和服务器之间的这次通信,和下次通信之间没有直接的联系. 但是在实际的开发过程之中, 我们很多时候是需要知道请求之间的关联关系的. 例如登陆网站成功后,第二次访…...
uniapp canvas vue3 ts实例
<template><view><canvas canvas-idcanvas-test class"canvas-test"></canvas></view> </template><script setup lang"ts">//封装的jsimport libs from /libs;//重点引入的import type { ComponentInternalIns…...
网络构建关键技术_3.SDN技术
SDN网络在控制平面和转发平面分别采用了不同技术,以满足SDN网络控件的全局性和灵活性,业务转发的高效性及高性价比要求。主要关键技术包括:控制平面技术、数据平面技术和转发规则一致性更新技术等。 1.控制平面技术 控制器是控制平面核心部件…...

【高性能服务器】单进程服务器
🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 单进程服务器 …...

任意密码重置漏洞
文章目录 1. 任意密码重置漏洞原理2. 任意密码重置漏洞产生原因3. 任意密码重置漏洞场景3.1 验证码爆破3.2 验证凭证回传3.3 验证凭证未绑是用户3.4 跳过验证步骤3.5 凭证可预测3.6 同时向多个账户发送凭证 4. 任意密码重置经典案例4.1 中国人寿某重要系统任意账户密码重置4.2 …...
synchronized关键字和ReentrantLock在不同jdk版本中性能哪个高?该怎么选择呢?
synchronized关键字和ReentrantLock在不同JDK版本中的性能差异经历了显著的变化。早期,在JDK 1.5及以前的版本中,ReentrantLock通常提供了更好的性能,主要是因为synchronized关键字的实现较为简单,没有太多的优化,导致…...

【旭日x3派】部署官方yolov5全流程
地平线旭日x3派部署yolov5--全流程 前言一、深度学习环境安装二、安装docker三、部署3.1、安装工具链镜像3.2、配置天工开物OpenExplorer工具包3.3、创建深度学习虚拟空间,安装依赖:3.4、下载yolov5项目源码并运行3.5、pytorch的pt模型文件转onnx3.6、最…...
java LinkedList 怎么保证线程安全
在 Java 中,LinkedList 本身并不是线程安全的。如果需要在多线程环境中使用 LinkedList,可以采取以下几种方法来保证线程安全性: 1. 使用 Collections.synchronizedList Java 提供了一个实用的方法 Collections.synchronizedList 来包装 Li…...

uniapp+vue3开发微信小程序踩坑集
本文主要记录使用uniappvue3开发微信小程序遇见的各种常见问题及注意点。(持续更新) 问题: 自定义组件为什么有些样式加不上去 给自定义组件增加class的时候,有时候不生效有时候生效,一度让我怀疑自己记忆错乱。后来…...

办公软件WPS与Office的区别
临近计算机考试很多同学在纠结我是报wps好?还是ms office好?下面就来详细说说。 1、wps属于国内金山公司的办公软件,里面包含word、Excel和PPT。考试是2021年开始的! 2、MS(Microsoft 微软) office属于美…...

[数据集][目标检测]睡岗检测数据集VOC+YOLO格式3290张4类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3316 标注数量(xml文件个数):3316 标注数量(txt文件个数):3316 标注…...
使用Java编写网络爬虫
使用Java编写网络爬虫 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 网络爬虫是一种自动化程序,用于从互联网上获取信息并收集数据。在Java中编写…...

生鲜水果行业wordpress主题
水果蔬菜wordpress外贸自建站模板 水果、脐橙、牛油果、菠萝、凤梨、鲜枣、苹果、芒果、瓜果、百香果wordpress外贸独立站模板。 https://www.jianzhanpress.com/?p3932 生鲜wordpress外贸出口网站模板 水果、蔬菜、肉蛋奶、水产、干货等生鲜产品wordpress外贸出口公司网站…...

3.3V到5V的负电源产生电路(电荷泵电压反相器)SGM3204输出电流0.2A封装SOT23-6
前言 SGM3204 非稳压 200mA 电荷泵负电源产生电路,LCEDA原理图请访问资源 SGM3204电荷泵负电源产生电路 SGM3204电荷泵负电源产生电路 一般描述 SGM3204从 1.4V 至 5.5V 的输入电压范围产生非稳压负输出电压。 该器件通常由 5V 或 3.3V 的预稳压电源轨供电。由于…...

Excel 宏录制与VBA编程 —— 15、MsgBox参数详解
Msgbox参数具体如下 Msgbox参数使用1 Msgbox参数使用2(返回值示例) &ensp ;###### 关注 笔者 - jxd...

Kafka~消息发送过程与ISR机制了解
消息发送过程 使用Kafka发送消息时,一般有两种方式分别是: 同步发送异步发送 同步发送时,可以在发送消息后,通过get方法等待消息结果,这种情况能够准确的拿到消息最终的发送结果,要么是成功、要么是失败…...
multiprocessing.Queue 多个进程生产和多个进程消费怎么处理
在这个示例中,我们创建了一个队列 q,并通过 multiprocessing.Manager().Queue() 来确保队列可以在多个进程之间共享。我们定义了 consumer 和 producer 函数,分别用于从队列中获取数据和向队列中放入数据。 在主进程中,我们创建了…...

配置 Python 解释器及虚拟环境
配置 Python 解释器及虚拟环境 配置 Python 解释器: 1. 打开 PyCharm,进入“File”(文件)菜单,选择“Settings”(设置)。 2. 在弹出的设置窗口中,选择“Project: [项目名称]”下的…...

JeecgBoot中如何对敏感信息进行脱敏处理?
数据脱敏即将一些敏感信息通过加密、格式化等方式处理,展示给用户一个新的或是格式化后的信息,避免了敏感信息的暴露。 一、接口脱敏注解 针对接口数据实现脱敏加密,只加密,一般此方案用于数据加密展示。 1.1 注解介绍 注解作用域…...

【Docker】存储数据卷
目录 1、挂载数据卷到容器里 2、查询挂载文件 3、容器与主机之间映射共享卷 4、三个容器之间使用共享卷 5、卷数据的备份与恢复 5.1 备份 5.2 恢复 1、挂载数据卷到容器里 docker run -itd --name test02 -v /data nginx docker exec -it test02 bashls / docker inspe…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...