【SSM-Day5】Cookie和Session

【SSM-Day5】Cookie和Session

一个客户端-服务器架构的项目,是基于Http协议进行交互的。

http协议是"无状态"协议。即,客户端和服务器之间的每一次通信都是完全独立的。每次通信之间不会有任何关联。

但是在一个客户端-服务器架构的项目中,往往需要保持状态。

比如用户前一刻在哔站登录页登录哔站后跳转到自己的哔站主页,后一刻进入了哔站的其他页面,如果此时客户端和服务器之间的通信是无状态的,那么用户在进入哔站其他页面的时候,也会随之退出登录状态。

为了解决上述客户端和服务器之间基于http协议的无状态问题,分别在客户端和服务器引入了cookie机制和session机制。

Cookie是存储在客户端的一种小型文本文件

当浏览器访问一个网站的时候,如果该网站需要识别用户的身份,或者需要保存特定信息,这个网站会发送一个Cookie到用户的浏览器。cookie中的内容通常是该用户的身份信息和一些其他数据。浏览器接收到这个Cookie后,会将其保存在硬盘的特定区域,这块区域通常是浏览器专门为该网页在硬盘上开辟的一小块空间。

当用户再次访问该网站时,网站会读取Cookie文件,从而实现用户身份的识别或信息的恢复‌。

以上关于cookie的过程都是自动的,用户无需进行任何操作。

Session和Cookie

session:会话。

在计算即领域,会话是一个客户与服务器之间的不间断的请求响应。当一个未知的客户向Web应用程序发送一个第一个请求时,就开始了一个会话,会话开始后,客户和服务器之间会多次通信。当该客户明确结束会话或者服务器在一个时限内没有接受到客户的任何请求时,这个会话才会结束了。显然这不是仅靠http协议可以做到的。

在上述客户与服务器会话的场景中,服务器通常会同时收到来自不同客户的很多请求,但服务器在处理这些请求的时候,能清楚的识别该请求属于哪个客户,进一步确定该请求属于哪个会话,这正是因为服务器的Session机制。

Session机制指的是:在服务器一块特定内存中存储了一个session对象。

Session对象的本质是一个哈希表,在这个哈希表中存储了一些键值对结构。Key就是SessionID,Value就是用户信息(用户信息可以根据需求灵活设计)。

服务器每开启一个新会话,Session对象的内容就会发生变化。

ps:虽然说如果重启服务器则Session数据就会丢失,但一台工作的服务器除非报废否则就会一直用而且这台工作的服务器通常都有实时备份。

当用户登录到网站后,服务器会先在Session中新增一条Key-Value格式的记录(Key是服务器为这个用户设置的SessionID,Value中记录着这个用户的相应信息),然后把sessionId放到响应报文中的Set-Cookie字段里一起返回给客户端。

浏览器从报文中的Set-Cookie字段拿到sessionId并保存在cookie文本中,用户后续再给服务器发送请求的时候,网站会先读取cookie文本,然后把整个cookie(当然sessionId也在里面)放到请求报文里,一起传给服务器。

服务器收到请求之后,获取到cookie后从中寻找到sessionId,并和内存中Session信息中的sessionId对比,确定这个请求对应的sessionId存在后,获取到对应的Value,也就定位到了具体的用户信息,服务器有记忆的服务该客户,进行后续操作。

如果在cookie中找不到,则重新创建一条Session记录,并把SessionID返回。

总结一下~

  1. Cookie是客户端保存用户信息的⼀种机制,Session是服务器端保存用户信息的⼀种机制.。
  2. Cookie和Session之间主要是通过SessionId关联起来的,SessionId是Cookie和Session之间的桥梁。
  3. Cookie和Session经常会在⼀起配合使用,但是不是必须配合:
    • 完全可以用Cookie来保存⼀些数据在客户端,这些数据不⼀定是用户身份信息,也不⼀定是SessionId。
    • Session中的sessionId也不需要⾮得通过Cookie/Set-Cookie传递,比如通过URL传递。
相关推荐
core51212 天前
flink yarn模式3种提交任务方式
flink·yarn·任务·session·提交·方式·应用模式
岁岁岁平安14 天前
JavaWeb学习(4)(四大域、HttpSession原理(面试)、SessionAPI、Session实现验证码功能)
java·学习·javaweb·session·httpsession
枫叶丹417 天前
【在Linux世界中追寻伟大的One Piece】HTTP cookie
linux·运维·服务器·http·cookie
gc_229921 天前
学习ASP.NET Core的身份认证(基于Session的身份认证3)
asp.net core·session·身份认证
gc_229924 天前
学习ASP.NET Core的身份认证(基于Session的身份认证1)
asp.net core·session·身份认证
GGBondlctrl25 天前
【Spring MVC】如何获取cookie/session以及响应@RestController的理解,Header的设置
java·spring·mvc·cookie·session·header·restcontroller
gc_22991 个月前
学习ASP.NET Core的身份认证(基于Cookie的身份认证1)
asp.net core·cookie·身份认证
gc_22991 个月前
学习ASP.NET Core的身份认证(基于Cookie的身份认证3)
asp.net core·cookie·身份认证
gc_22991 个月前
学习ASP.NET Core的身份认证(基于Cookie的身份认证2)
asp.net core·cookie
爱吃土豆的程序员1 个月前
在oracle官网下载资源显示400 Bad Request Request Header Or Cookie Too Large 解决办法
java·数据库·oracle·cookie