当前位置:网站首页>Cookie和Session
Cookie和Session
2022-07-26 19:27:00 【海绵宝宝养的的小窝】
Cookie
Cookie本质上其实就是浏览器给页面提供的一种能够持久化存储数据的机制。
持久化的意思是数据不会因为程序重启或者主机重启而丢失,其实就是把数据存入了磁盘里。
如果数据存储在内存里,程序重启或者主机重启,数据就释放了。而如果写在了磁盘文件里,下次直接读取磁盘文件即可。
浏览器默认情况下是不能让页面访问到你的电脑文件的,如果网页上包含恶意代码,将你电脑上存储的学习资料都删了,那这将是一个悲伤的故事。
但我们有些时候又必须要存储一些数据,方便访问后续的网页,最常见的就是登录存储用户信息。当我们登录一个网页时,能够随意跳转页面而不需要重新登录。这是因为服务器在我们登录后为浏览器返回了一个用户的身份信息,浏览器会为这个身份信息单独开辟一块空间,将一些重要信息丢到这里面,只给这个空间的访问权限。然后再之后的跳转页面就会带上这个身份信息,从而不需要重新登录。而Cookie就是其中一种典型的小黑屋空间。
登录gitee通过fiddler抓包,我们来查看Cookie怎么来的

我们可以清楚的看到服务器给登录请求的响应中返回了header的3个set语句。
这其实就是服务器完成身份验证后给客户端返回的一些具体信息,客户端就可以凭着这些信息,来完成后续页面访问。
Session
虽然可以通过Cookie保存各个网站的信息,但容量也是有限的,如果空间不够了咋办?
其实这个完全不用担心,因为Cookie其实保存的东西并不是很多,主要的信息还是存储在服务器内。服务器管理许多的Session(会话),每个会话都存储了用户的关键信息(基本信息+记录+行为),每个Session都有一个SessionId(会话标识),而Cookie存储的其实就是这个SessionId,这样客户端只需要传给服务器一个SessionId,服务器就会根据SessionId传回一个会话。
其实这个很好理解,在平时我们就经常见到~例如QQ,

qq这个服务器存储了许多我们与好友的聊条记录,每个与好友聊天的记录就是一个会话,每个好友的qq号就是一个会话id。我们就能通过会话id找到会话。
Servlet中Cookie和Session的应用
servlet中对于Cookie和Session都有很好的支持,我们就可以根据Servlet中的提供的Api,来进行会话管理。
HttpServletRequest类
getSession方法,既能用于获取到服务器上的会话,也能用于创建会话.具体行为,取决于参数.
如果参数为true:会话不存在,则创建会话;存在,则获取。
如果参数为false:会话不存在,则返回null;会话存在,则获取。
在调用getSession方法时具体要做的事情:
①创建会话:首先获取到请求中Cookie里的SessionId字段,然后判断这个SessionId是否在服务器上存在,如果不存在,则进入创建会话逻辑。会创建一个 HttpSession 对象,并且生成一个 sessionId。(sessionId 是一个很长的数字,通常是用 十六进制来表示的)。
接下来,就把 sessionId 作为 key,把这个 HttpSession 对象,作为 value。把这个键值对,给保存到 服务器内存 的一个“哈希表” 这样的结构中。(实际上不一定是一个hash表,而是一个用来类似于key/value的存储结构) 再然后,服务器就会返回一个 HTTP 响应,把 sessionId 通过 Set-Cookie 字段 返回给浏览器。然后,浏览器就可以保存这个 sessionId 到 cookie中了。②获取会话:先获取到请求中的cookie里面的sessionld字段判定这个sessionld是否在当前服务器上存在(也就是在这个哈希表中是否有),如果有,就直接查询出这个 HttpSession对象,并且通过返回值返回回去.
HttpSession类
一个 HttpSession 对象里面包含多个键值对. 我们可以往 HttpSession 中存任何我们需要的信息


Cookie类
每个Cookie对象又包含了两个属性:name, value(还是键值对)

HttpServletResponse类

响应中就可以根据 addCookie 这个方法,来添加一个 Cookie 信息(键值对)到 响应报文中
这里添加进来的键值对,就会作为 HTTP 响应中的 Set-Cookie 字段来表示。
换个说法:把一个cookie键值对 转换成 字符串 格式,通过 Set-Cookie 来返回到 客户端(浏览器)这里。
代码示例:实现用户登录
①约定前后端交互接口

②编写代码





升级



完。
边栏推荐
猜你喜欢

DOM case: 10 second countdown - write jump page related knowledge

数组操作增,删,改,查

如何实现一个能处理海量数据的异步任务队列系统(至尊典藏版)

会议OA之会议排座&送审

KVM virtualization

试用了多款报表工具,终于找到了基于.Net 6开发的一个了

Docker使用mysql:5.6和 owncloud 镜像,构建一个个人网盘,安装搭建私有仓库 Harbor

以 NFT 为抵押品的借贷协议模式探讨

Zhongtian steel uses tdengine in GPS and AIS scheduling

Use of load balancing
随机推荐
URL格式
three.js 制作地球标注的两种方法
Week 6 Convolutional Neural Networks (CNNs)
Ten sorting details
【MySQL】 - 索引原理与使用
Read the high-performance queue channel in.Net
金融机构盘点
How to build a super interface collaboration platform: count the six weapons of apifox
【JVM 系列】JVM 调优
mysql使用union 排序问题
使用请求头认证来测试需要授权的 API 接口
Silent desktop fan chip dltap703sd Jericho
DevOps 实践多年,最痛的居然是?
数组操作增,删,改,查
金仓数据库 KingbaseES SQL 语言参考手册 (19. SQL语句: DROP TABLE 到 LOAD)
LeetCode_回溯_中等_216.组合总和 III
Vite 配置 Eslint 规范代码
内网渗透学习(二)信息收集
一个开源的网页画板,真的太方便了
kvm虚拟化