session在服务端保存信息,是否关闭浏览器和session销毁无关,即:即便关闭浏览器,session仍是存在的。可是为何关闭浏览器后session好像就消失了。html
参考:https://my.oschina.net/kevinair/blog/192829前端
1 session和cookie的关系java
session在服务端保存信息,cookie在客户端保存信息。浏览器
实际上有三种方式能可让 Session 正常工做:服务器
· 基于 URL Path Parameter,默认支持。cookie
· 基于 Cookie,若是没有修改 Context 容器的 cookies 标识,默认也是支持的。session
· 基于 SSL,默认不支持,只有 connector.getAttribute("SSLEnabled") 为 TRUE 时才支持。.net
这里咱们只涉及session基于cookie的工做模式。code
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决定htm
综上所述:
一、sessionId是一个cookie,max-age默认为-1,即关闭浏览器后sessionId就会清空
二、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")获取值。
转载请标明原文出处:http://www.javashuo.com/article/p-npvstfzw-co.html