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