【会话技术】Cookie和Session的工作流程和区别
Cookie技术
web程序是通过HTTP协议传输的,而HTTP是无状态的,即后续如果还要使用前面已经传输的数据,就还需要重传。这样如果数据量很大的情况下,效率就会大打折扣。Cookie的出现就是为了解决这个问题。
Cookie的工作流程:
客户端第一次请求时携带数据发送给服务器,服务器这边决定将哪个数据用Cookie存储,并通过响应将Cookie返回给客户端,然后客户端这边会存储在浏览器上或硬盘中。之后每次HTTP请求中自动携带这个Cookie给服务器。它位于header中的一个属性。
Cookie的特点:
数量有限,单个存储大小有限,安全性无法得到保障,浏览器可以禁用cookie。如果用户禁用cookie,则无法使用cookie。
Cookie的生存周期:
可以根据需求设置。没有设置的话默认是关闭浏览器,cookie就会删除,生命周期就会结束。
Cookie在生成时,就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为0或者负值,这样在关闭浏览器时,就会马上消除Cookie,不会记录用户的信息,更加安全。
Cookie的应用场景:
对于安全性不高的数据,数据量不大的数据存储比较合适。
cookie可以用来保存用户的登录信息。比如10天内免登陆等等。如果删除cookie下次就需要重新登陆。
Session技术
会话:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源然后关闭浏览器,整个过程称之为一个会话。
Session的工作流程:
- 当用户请求应用程序的web页面时,如果该用户还没有会话,就会为该用户创建一个会话,即创建一个Session对象,对象中会存储该用户会话所需的属性等。
- 这样,当用户在应用程序的多个web页面进行跳转时,存储在session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
- 会话创建成功后,服务器会向客户端发送一个sessionId,同时服务器这边也会把sessionId和对应的用户信息,用户操作记录在服务器上,客户端收到sessionId后会储存在cookie里,再次访问时就会发送这个cookie,服务器通过sessionId就知道用户是谁了。类似于去理发店剪头发,店员就会让你办一个会员卡,办了之后,理发店就会有你的一些相关信息,比如姓名,电话号码,消费记录,余额等。并且会给你一个会员卡(相当于sessionId),下次理发时拿上会员卡,理发店就知道是哪位顾客来了。

假设一个网站对应一个 webapp, 而 webapp 必然储存着大量用户的会话 Session, 存储的结构是类哈希表结构, 一个会话的Key 值是 服务器分配的 id, 即 sessionId, 这个Key对应的value(HttpSession)是这个用户的个人信息, 也是以键值对的形式组织的。

Session的生命周期:
可以根据需求设置。默认是30分钟。举个例子,如果设为10分钟的话,当你登录一个服务器,登陆成功的话,服务器会返回一个sessionId,登陆成功之后的10分钟内没有客户端这边进行任何HTTP请求,10分钟后你再发送一个HTTP请求,就会提示你需要重新登陆。
每次登陆的时候会重新创建会话,服务器重新返回sessionId,客户端通过请求中携带的id可以不断访问该web程序的多个界面,生命周期结束有常见的两种,用户主动点击退出登录(注销)或一段时间内没有进行操作。后面用户再次登录时就需要重新登陆,重新创建会话以及服务器返回新的sessionId。以此循环。注销就是服务器那边通过代码逻辑消除了会话对象。id也消除了。客户端这边再次请求时id就会无法匹配,就需要重新登陆。一段时间内不操作也是如此。
Session的应用场景:
判断一个用户是否是登录状态,非登录状态强制跳转到登录页面。不是所有用户都会先进入登录页面输密码,有可能他直接在地址栏里强行输入主界面或其他操作界面的URL,这个时候就会出现问题。我们可以使用Session,当用户登录的时候为他设置一个session对象,直至退出登录,该session销毁。并在每个页面里加入判断是否存在session对象,不存在就强制跳转到登录页面。
进一步想要提高安全性,可以对sessionId增加时间和空间上的显示,异地需重新登录,一段时间后需要重新登陆。
代码示例,登录时创建会话:
// 验证通过 进行登录 创建会话 使用该会话创建用户信息// true表示会话存在就查找 不存在就创建新的会话HttpSession session = req.getSession(true);// 会话保存操作 后续通过第一个参数获取到会话 session.setAttribute("user",user);// 进行重定向 跳转到主页面 重定向使得登录成功操作不能去回转resp.sendRedirect("mainInterface.html");
代码示例,获取会话:
// 使用这个方法来获取用户的状态// false的作用 有会话返回对象 无会话则返回nullHttpSession session = req.getSession(false); if(session == null) {//说明无会话 表明该用户是未登录状态//创建一个空的用户对象User user = new User();//将空对象的内容以json格式进行响应String respJson = mapper.writeValueAsString(user);resp.getWriter().write(respJson);return;}//获取会话对象User user = (User) session.getAttribute("user");//与上面保存会话的key值要一样
两者区别:
- 存储位置不同
Cookie可以存储在浏览器或本地硬盘上,Session只能存储在服务器上。
- 安全性不同
Session比Cookie更安全。
- 对服务器的压力不同
Session占用服务器资源和性能,Session过多,会增加服务器压力。
- 存储大小不同
Cookie在浏览器这边存储,浏览器对cookie的存储有限制,个数一般不超过20个,单个Cookie存储的数据不超过4k。Session没有大小限制,它与服务器的内存大小有关。
- 存储对象不同
Session能存储任意类型的Java对象(类似于哈希表结构存储),Cookie只能存储String类型的对象。(以键值对结构存储)
相关文章:
【会话技术】Cookie和Session的工作流程和区别
Cookie技术 web程序是通过HTTP协议传输的,而HTTP是无状态的,即后续如果还要使用前面已经传输的数据,就还需要重传。这样如果数据量很大的情况下,效率就会大打折扣。Cookie的出现就是为了解决这个问题。 Cookie的工作流程&#x…...
Xmake v2.8.5 发布,支持链接排序和单元测试
Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时。 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好&#x…...
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远程控制软件总结
红队专题 招募六边形战士队员[30]远控班第一期课程与远控总结 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [30]远控班第一期课程与远控总结 一.Bug修复(1)生成路径(2)显示系统版本号二.内存泄露(1)如何检查内存泄露 #define CRTDBG_…...
MyBatis与SQL实用技巧 实用语法
数据库SQL技巧 数值转字符 <select id"getMaterialsList" resultType"java.util.Map">selectmaterial_id materialId,material_name materialName,unit, specification, CONVERT(unit_price,CHAR) unitPricefrom trace_agriculture_materialwhere …...
更好的理解c++中的虚函数和静态多态以及动态多态
1.虚函数(Virtual Function) 在c 中, 虚函数是定义在基类中的函数,但是它可以在派生类中进行重写(Override) 。 通过在基类中通过virtual 关键字声明函数 , 你创建了一个可以在任何派生类中特别实现的接口…...
MybatisPlus之新增操作并返回主键ID
在应用mybatisplus持久层框架的项目中,经常遇到执行新增操作后需要获取主键ID的场景,下面将分析及测试过程记录分享出来。 1、MybatisPlus新增方法 持久层新增方法源码如下: public interface BaseMapper<T> extends Mapper<T> …...
工程(十四)——ubuntu20.04 PL-VINS
博主创建了一个科研互助群Q:772356582,欢迎大家加入讨论。这是一个科研互助群,主要围绕机器人,无人驾驶,无人机方面的感知定位,决策规划,以及论文发表经验,以方便大家很好很快的科研…...
C复习-结构struct+bit field+union
参考: 里科《C和指针》 结构的声明 struct {int a;char b; } x; struct {int a;char b; } y[20], *z;// 会报错,因为z和x虽然都没有名字,但是并不是一个东西 z &x;struct SIMPLE {int a;char b; }; // 这样就对了,因为名字匹…...
1 快速了解Paimon数据湖核心原理及架构
1.1 什么是Apache Paimon Apache Paimon的前身属于Flink的子项目:Flink Table Store。 目前业内主流的数据湖存储项目都是面向批处理场景设计的,在数据更新处理时效上无法满足流式数据湖的需求,因此Flink社区在2022年的时候内部孵化了 …...
chrome v3开发插件实现所有网站允许跨域
场景: chrome 插件 升级到v3后,原来修改请求响应都变成异步,即无法同步拦截来修改请求响应。 在v3中也不支持修改请求响应内容。 问题:如何在chrome v3中允许其他网站跨域呢。 方式一:禁用chrome跨域,禁…...
unity Holoens2开发,使用Vuforia识别实体或图片 触发交互
建议:先看官方文档 我使用的utniy 版本:Unity 2021.3.6f1 官方建议:混合现实工具包简介 - 设置项目并使用手势交互 - Training | Microsoft Learn 配置了正确工具的 Windows 10 或 11 电脑Windows 10 SDK 10.0.18362.0 或更高版本安装了 U…...
从零开始搭建微服务(一)
构建项目父工程 添加公共核心模块 安装nacos 安装nacos nacos 文档地址: https://nacos.io/zh-cn/docs/what-is-nacos.html 本文使用版本2.2.2 下载地址:https://github.com/alibaba/nacos/archive/refs/tags/2.2.2.zip 使用nacos 我们下载是源代码 解…...
一种可以实现安全便捷文件摆渡的跨网文件安全交换软件
为了保护数据的安全性和完整性,很多企业都采用了内外网物理隔离的方式,防止核心数据泄露或被恶意篡改。然而,这也给企业内部或与外部合作伙伴之间的文件交换带来了很多不便和挑战。如何在保证数据安全的前提下,实现跨网文件的快速…...
『 MySQL数据库 』数据库基础之表的基本操作
文章目录 创建表🗡查看表🗡✒ 查看表内所有信息(描述\表结构等)✒ 根据条件查看表内数据✒ 查看表的具体详细信息: 修改表🗡✒ 修改表名:✒ 修改表的存储引擎、编码集(字符集和校验集):✒ 表内插入数据:insert into✒ 在表中新添一个字段(列)…...
如何提高40%的Docker构建时间
1. 背景 在产品开发中构建docker镜像,随着时间的推移,会变得越来越大,构建时间也越来越长。我的目标是构建时间不超过 5 分钟。 2. 遵循Dockerfile的最佳实践 我们首先确保Dockerfile文件遵循Docker官方的最佳实践,具体做法有: 尽量使用官方的基础镜像,Docker推荐使用…...
真正解决jellyfin硬解码转码
前段时间入手一个DS423集成显卡UHD600,搭了一个jellyfin,发现网上关于硬解码的教程基本都存在问题,没有真正解决我的硬解码问题。经过一系列分析修改,最终实现硬解码。先贴效果图: 下载安装jellyfin这里就不叙述&#…...
声音训练数据集哪里找?中文、英文
一般找数据集的都是需要训练底膜的,大家git上找的开源项目大多是预训练模型。预训练就是别人已经训练好的底膜,你在他的基础上进行调整。而我们训练如果他这个模型不理想是需要训练底膜的。 找的方式是从git开源上找 中文 推荐MockingBird,…...
springboot中如何同时操作同一功能
问题描述 测试阶段,由于存在某一功能的同时操作,该功能还是入库逻辑,此时若不进行处理,会造成插入表中多条重复数据,为此该问题需要修复。 解决办法 在接口开始进行对是否存在某个key值的判断,若不存在&…...
YOLOWeeds: 用于棉花生产系统中多类杂草检测的 YOLO 目标检测器的新基准
YOLOWeeds: A novel benchmark of YOLO object detectors for multi-class weed detection in cotton production systems 摘要1、介绍2、总结 摘要 过度依赖除草剂控制杂草,加速了杂草的抗除草剂进化,引起了对环境、食品安全和人类健康的日益关注。自动…...
Vue3:自定义图标选择器(包含 SVG 图标封装)
文章目录 一、准备工作(在 Vue3 中使用 SVG)二、封装 SVG三、封装图标选择器四、Demo 效果预览: 一、准备工作(在 Vue3 中使用 SVG) 本文参考:https://blog.csdn.net/houtengyang/article/details/1290431…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...
