Session的实现原理
- 用现象说明问题,我在Servlet4中的代码设置了Session的属性
//得到Session对象 HttpSession httpSession = request.getSession(); //设置Session属性 httpSession.setAttribute("name", "看完博客就要点赞!!");
接着在Servlet7把Session的属性取出来
String value = (String) request.getSession().getAttribute("name"); printWriter.write(value);
自然地,我们能取到在Servlet4中Session设置的属性
接着,我在浏览器中新建一个会话,再次访问Servlet7
发现报了空指针异常的错误
- 现在问题来了:服务器是如何实现一个session为一个用户浏览器服务的?换个说法:为什么服务器能够为不同的用户浏览器提供不同session?
- HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一个用户。于是乎:服务器向用户浏览器发送了一个名为JESSIONID的Cookie,它的值是Session的id值。其实Session依据Cookie来识别是否是同一个用户。
- 简单来说:Session 之所以可以识别不同的用户,依靠的就是Cookie
- 该Cookie是服务器自动颁发给浏览器的,不用我们手工创建的。该Cookie的maxAge值默认是-1,也就是说仅当前浏览器使用,不将该Cookie存在硬盘中
- 我们来捋一捋思路流程:当我们访问Servlet4的时候,服务器就会创建一个Session对象,执行我们的程序代码,并自动颁发个Cookie给用户浏览器
当我们用同一个浏览器访问Servlet7的时候,浏览器会把Cookie的值通过http协议带过去给服务器,服务器就知道用哪一Session。
而当我们使用新会话的浏览器访问Servlet7的时候,该新浏览器并没有Cookie,服务器无法辨认使用哪一个Session,所以就获取不到值