浏览器关闭,session有没有销毁,为何找不到session了

时间:2021-08-13 13:16:48

最近碰到一个问题,统计在线人数,初步想法能将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,具体代码如下:

HttpSession session=request.getSession();
String sessionid=session.getId();
Cookie cookie=new Cookie("JSESSIONID",sessionid);
cookie.setMaxAge(30*60);
response.addCookie(cookie);