JAVAEE session,cookie详解

1.1会话跟踪技术(回顾)

HTTP协议是一种无状态协议,其本身是无法进行会话跟踪的,即无法在不同的请求间进行状态保存(数据传递)。

什么会话?简单来说,只要打开了一个浏览器页面,在不关闭该页面的情况下所发出的所有请求,都属于一次会话。

常见的会话跟踪技术有两种:Cookie与Session。

1.1.1Cookie工作原理

用户在提交第一次请求后,由服务器生成Cookie,并将其封装到响应头中,以响应的形式发送给客户端。在客户端接收到这个响应后,将Cookie保存到客户端。
注意,Cookie总是与某个请求路径相绑定,即客户端只要发送包含有相同指定路径的请求,就会将该Cookie发送给服务端。当然,在Cookie中包含有数据。服务端会根据客户端发送来的Cookie数据对会话进行跟踪,即在不同请求间进行数据通信。

1.1.2Session工作原理

HttpSession是Cookie技术在服务端的会话跟踪实现。在服务器中系统会为每组会话维护一个Session,不同的会话对应不同的Session。什么是一组会话?包含有“部分相同请求路径”的若干请求/响应的集合,称为一组会话。这里的“部分相同请求路径”默认指的是ContextPath路径,即当前web应用的根路径。

HttpSession是一个可以存放键值对数据的域属性空间,同一组会话对应同一个Session域属性空间,从而实现了同一组会话中不同请求间数据的通信,即会话跟踪。

(1)写入Session列表

服务器对当前应用中的Session是以Map的形式进行管理的,这个Map称为Session列表。这个Map的key为一个32位长度的随机串,这个随机串称为SessionID,而value为HttpSession对象的引用。
当用户第一次提交请求时,服务端Servlet中执行到request.getSession()后,会自动生成一个Map.Entry对象,生成一个HttpSession对象,并根据某算法自动生成32位长度的随机串。然后将随机串(即SessionID)作为Map.Entry对象的key,将新生成的HttpSession对象引用作为Map.Entry对象的value。

(2)服务器生成并发送Cookie

在将Session信息写入Session列表后,系统会自动将“JSESSIONID”作为name(基于JavaEE协议的情况下),将这个32位长度的随机串作为value,以Cookie的形式存放到响应报头中,并随着响应将该Cookie发送给客户端。

(3)客户端接收并发送Cookie

客户端接收到这个Cookie后会将其存放到浏览器缓存中。即只要客户端浏览器不关闭,浏览器缓存中的Cookie就不会消失。

当用户在当前应用下提交第二次请求时,即提交的请求路径中携带有当前web应用的根路径时,就会将缓存中的这个Cookie伴随着请求的头部信息一并发送给服务端。

(4)服务端从Session列表中查找

服务端在接收到客户端发送来的请求后,会从请求中读取到客户端发送来的Cookie,并根据名称为JSESSIONID的Cookie的value值,从Session列表的Map的key中查找是否存在该JSESSIONID。若找到了该key,即可找到其对应的HttpSession对象。然后就可以对该Session域属性空间进行读写操作了。
发布了13 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_40908734/article/details/100017430