Session是什么
在Java服务器中,Session是一个Java的Class, 是服务器内存中的一个概念
1 | javax.servlet.http.HttpSession; |
每一个Session是一个实例化的对象,内部有个Map可以通过键值对保存数据
Cookie是什么
参考文章 HTTP报文基本概念 可知道 Cookie是HTTP请求中的一个概念
Cookie是HTTP报文头的一部分,内部是Key-Value键值对来储存数据的
Session和Cookie的关系
从上文得知Session和Cookie压根是两个领域的概念 那么他们之间有什么关系呢
- 在HTTP的概念中可以得知HTTP报文是短连接报文,每一次是由一个Request和一个Response组成,两次请求之间没有关系。
- 那么当我们使用浏览器时,首先坐了用户登录,然后进行了一系列操作
那么问题来了 服务器如何知道我们多次操作是来自同一个用户(浏览器)的呢?
答案就是Session和Cookie两个机制共同作用,用来完成操作来源者但识别工作
Session的职能
- 服务器收到一个新请求
- 检查Cookie中是否有Session字段(SessionID)
此时会有两种情况,第一次请求
- 没有Session字段,此时服务器容器new Session()
- new出的Session会生成一个SessionID
- SessionId被通过Response中但Set-Cookie字段放到HTTP的返回中
第二次请求
- 发现SessionID,找到服务器中已经被实例化的Session
- 由于找到了Session,所以可以使用Session中保存的数据
Cookie的职能
- 浏览器发出请求,带走当前域下浏览器缓存区里所有Cookie
- 浏览器得到返回报文,从Set-Cookie字段里取出所有Cookie放入当前域缓存
Session与Cookie的协同作用
通过Session和Cookie但职能描述我们发现
- Cookie只是一个传递手段,每次HTTP请求都不关心其中的内容
- 服务器如何判断是不是同一来源的请求,依赖于Cookie有没有保存Session的字段SessionID
也就是说
第一次请求时,Cookie中没有SessionID,服务器会生成,然后放入Response报文返回到浏览器里,之后的请求浏览器会发送带有SessionID的Cookie,所以服务器可以判断出是否来自同一来源
Session与Cookie中的一些混淆的概念
Q:程序员常说的”从Cookie中取出Session”是什么
A: 这句话的完成表达是 “从服务器当前域下的Cookie中取出SessionID”
Q:Session里的数据能不能被浏览器读取到
A: Session是服务器的概念,存在于服务器的内存中,只是其一个参数SessionID被放入了Cookie,所以说Map中的数据不会出现在HTTP报文中,只有前端拿着这个SessionID跑到服务器来,在服务器的逻辑中才能取到Session中的数据
Q:我A网站的Session会不会被带到B网站
A: 在浏览器中有个域的概念,不同的网站有不同的缓存空间,你在A网站下发送的HTTP请求,只能从自己的缓存空间里拿Cookie,拿不到B的Cookie,自然也就读不到B的SessionID,但是如果浏览器本身就被人修改过就不一定了。这里牵扯到了网络安全的基本知识,细节请自行学习。
Q:Session和用户是否登录有关系么?
A: Session是服务器管理HTTP链接的一个机制,和用户登录不登录没有关系,用户登录是在该机制上层业务层的一个东西,不管是否登录都有Session存在,无非是生成的Session中是否包涵的登录信息。
简单来说如果用户登录成功,生成的SessionID为11位,如果没有成功生成SessionID是10位,那么当Session返回服务端的时候,通过判断位数就可以验证用户当前是登录还是未登录的逻辑。(实际应用中并不会这么简单,SessionID的生成逻辑更复杂)
Q:Session可以自定义么
A: Session是可以自定义的,不一定使用javax.servlet.http.HttpSession,甚至和HTTP也没关系,它本身仅仅是一种状态保持逻辑,比如Spring有自己的Session类,Shiro也有自己的Session,用错甚至会引发问题