天天看點

python關閉浏覽器、未過期的session_解決因為關閉浏覽器造成session失效的假象

session在服務端儲存資訊,是否關閉浏覽器和session銷毀無關,即:即使關閉浏覽器,session還是存在的。但是為什麼關閉浏覽器後session好像就消失了。

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")擷取值。