解决因为关闭浏览器造成session失效的假象

 session在服务端保存信息,是否关闭浏览器和session销毁无关,即:即使关闭浏览器,session还是存在的。但是为什么关闭浏览器后session好像就消失了。

参考:https://my.oschina.net/kevinair/blog/192829

1 session和cookie的关系

session在服务端保存信息,cookie在客户端保存信息。

实际上有三种方式能可以让 Session 正常工作:

  · 基于 URL Path Parameter,默认支持。

 · 基于 Cookie,如果没有修改 Context 容器的 cookies 标识,默认也是支持的。

 · 基于 SSL,默认不支持,只有 connector.getAttribute("SSLEnabled") 为 TRUE 时才支持。

这里我们只涉及session基于cookie的工作模式。

Session是保存在服务端的,为什么后续请求会读取到session?因为请求会包含一个sessionId,该值存储在cookie中,服务器通过这个sessionId找到对应的session。
 cookie是有过期时间的,规则如下:http://www.cnblogs.com/gossip/p/5596092.html
Cookie的Max-Age决定了Cookie的有效期,单位为秒
0:Cookie立即作废(如果原先浏览器已经保存了该Cookie,那么可以通过设置Max-Age为0使其失效)
<0:默认,表示只在浏览器内存中存活,一旦浏览器关闭则Cookie销毁,浏览器的max-age默认为-1
>0:    将Cookie持久化到硬盘上,有效期由Max-Age决定

综上所述:
1、sessionId是一个cookie,max-age默认为-1,即关闭浏览器后sessionId就会清空
2、sessionId(cookie)清空后,自然就无法找到对应的session,所以session就失效了

下面分析为什么关闭浏览器后,好像session就过期了

服务端产生session后,会把session的id传回客户端,这样每个客户端就有了一个唯一的 ID,客户端只要传回这个 ID 就行了,这个 ID 通常是 NANE 为 JSESIONID 的一个 Cookie,value为session的id。

     session在服务端保存信息,是否关闭浏览器和session销毁无关,即:即使关闭浏览器,session还是存在的。但是为什么关闭浏览器后,好像session就不存在了。 这就是上文提到的,sessionID是通过cookie存再客户端的,并且存储的这个cookie的key为“JSESIONID”,value为sessionID的值。但是cookie的key(JSESIONID)的生存周期一般是浏览器关闭后消失,浏览器关闭后,JSESIONID消失。正常流程是前端请求服务端时会把cookie带过去,但是现在,因为浏览器关闭,JSESIONID为null。服务端再想通过JSESIONID获取session,就无法获取,这也是为什么关闭浏览器后,好像session就过期了。

解决办法:修改浏览器关闭后JSESIONID消失的默认设置,手动设置JSESSION的过期时间。

HttpSession session = request.getSession();

 session.setAttribute(“aa”, “bb”); 

session.setMaxInactiveInterval(2 * 60); // Session保存两分钟

Cookie cookie = new Cookie("JSESSIONID", session.getId());

 cookie.setMaxAge(2 * 60); // 客户端的JSESSIONID保存两分钟

cookie.setPath("/");

 response.addCookie(cookie);

这样即使浏览器关闭,服务端仍然可以通过request.getSession().getAttribute("aa")获取值。

转载请标明原文出处:https://my.oschina.net/u/1999167/blog/856180

转载于:https://my.oschina.net/u/1999167/blog/856180

你可能感兴趣的:(解决因为关闭浏览器造成session失效的假象)