最近碰到一个问题,统计在线人数,初步想法能将session管理起来,即可达成目的,但是发现直接关闭浏览器,session竟找不到登录用户了,难道关闭浏览器,session就销毁了?不是这样的
引用一些资料:http://blog.csdn.net/stanxl/article/details/47105051
session的运行机制
-
当一个Session开始时,Servlet容器会创建一个HttpSession对象,那么在HttpSession对象中,可以存放用户状态的信息
-
Servlet容器为HttpSession对象分配一个唯一标识符即Sessionid,Servlet容器把Sessionid作为一种Cookie保存在客户端的 *浏览器* 中
- 用户每次发出Http请求时,Servlet容器会从HttpServletRequest对象中取出Sessionid,然后根据这个Sessionid找到相应的HttpSession对象,从而获取用户的状态信息
为什么当我们关闭浏览器后,就再也访问不到之前的session了呢?
其实之前的Session一直都在服务器端,而当我们关闭浏览器时,此时的Cookie是存在
于浏览器的进程中的,当浏览器关闭时,Cookie也就不存在了。
其实Cookie有两种:
- 一种是存在于浏览器的进程中;
- 一种是存在于硬盘上
而session的Cookie是存在于浏览器的进程中,那么这种Cookie我们称为会话Cookie,
当我们重新打开浏览器窗口时,之前的Cookie中存放的Sessionid已经不存在了,此时
服务器从HttpServletRequest对象中没有检查到sessionid,服务器会再发送一个新的存
有Sessionid的Cookie到客户端的浏览器中,此时对应的是一个新的会话,而服务器上
原先的session等到它的默认时间到之后,便会自动销毁。
以上既是为何找不到session的原因,如何解决?
可以在登录的时候,手动把JSESSIONID保存到COOKIE中,并令其存在的生命周期更长(可以和session的生命周期保持一致),这样即使浏览器关闭,cookie也不会消失,JSESSIONID还在,服务器即可再找到该session,具体代码如下: