当前位置:网站首页>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 来返回到 客户端(浏览器)这里。
代码示例:实现用户登录
①约定前后端交互接口

②编写代码





升级



完。
边栏推荐
- How to build a super interface collaboration platform: count the six weapons of apifox
- 花1200亿修一条“地铁”,连接4个万亿城市,广东在想啥?
- 计算机组成原理常见面试题目总结,含答案
- Design of intelligent weighing system based on Huawei cloud IOT (STM32) [i]
- What should we do about the fragmentation of internal information? Try this
- Kingbasees SQL language reference manual of Jincang database (17. SQL statement: discard to drop language)
- go+mysql+redis+vue3简单聊室,第5弹:使用消息队列和定时任务同步消息到mysql
- 靠元宇宙和NFT,天下秀疯狂“割韭菜”?
- 高瓴加入的PRI,君联、华控、盛世、绿动等百家机构都杀进去了
- three.js 给地球加标签和弹窗
猜你喜欢

three.js 给地球加标签和弹窗

Read the high-performance queue channel in.Net

What should we do about the fragmentation of internal information? Try this

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

安全测试初学体验

高瓴加入的PRI,君联、华控、盛世、绿动等百家机构都杀进去了

SQL注入

并行执行(二)、multiprocessing

BluePrism流程业务对象的组件功能介绍-RPA第三章

An open source web drawing board is really convenient
随机推荐
金仓数据库 KingbaseES SQL 语言参考手册 (17. SQL语句: DISCARD 到 DROP LANGUAGE)
regular expression
一文读懂 .NET 中的高性能队列 Channel
How to build a super interface collaboration platform: count the six weapons of apifox
金仓数据库 KingbaseES SQL 语言参考手册 (16. SQL语句: CREATE SEQUENCE 到 DELETE)
2000字助你精通防抖与节流
并行执行(二)、multiprocessing
正则表达式
What should we do about the fragmentation of internal information? Try this
Fasttunnel open source intranet penetration framework
高瓴加入的PRI,君联、华控、盛世、绿动等百家机构都杀进去了
Kingbasees SQL language reference manual of Jincang database (17. SQL statement: discard to drop language)
试用了多款报表工具,终于找到了基于.Net 6开发的一个了
罗永浩赌上最后一次创业信用
Decompile jar files (idea environment)
STM32F103 active buzzer driver
Kingbasees SQL language reference manual of Jincang database (20. SQL statements: merge to values)
Dio问题总结
Use of load balancing
答应我,看完别再写狗屎代码了。。