解決由於關閉瀏覽器形成session失效的假象

 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

相關文章
相關標籤/搜索