瀏覽器關閉,session有沒有銷毀,為何找不到session了


最近碰到一個問題,統計在線人數,初步想法能將session管理起來,即可達成目的,但是發現直接關閉瀏覽器,session竟找不到登錄用戶了,難道關閉瀏覽器,session就銷毀了?不是這樣的

 

引用一些資料:http://blog.csdn.net/stanxl/article/details/47105051

 

session的運行機制

  • 當一個Session開始時,Servlet容器會創建一個HttpSession對象,那么在HttpSession對象中,可以存放用戶狀態的信息

  • Servlet容器為HttpSession對象分配一個唯一標識符即Sessionid,Servlet容器把Sessionid作為一種Cookie保存在客戶端的 *瀏覽器* 中

  • 用戶每次發出Http請求時,Servlet容器會從HttpServletRequest對象中取出Sessionid,然后根據這個Sessionid找到相應的HttpSession對象,從而獲取用戶的狀態信息

 

為什么當我們關閉瀏覽器后,就再也訪問不到之前的session了呢?

 

其實之前的Session一直都在服務器端,而當我們關閉瀏覽器時,此時的Cookie是存在

 

於瀏覽器的進程中的,當瀏覽器關閉時,Cookie也就不存在了。

 

其實Cookie有兩種:

 

  • 一種是存在於瀏覽器的進程中;
  • 一種是存在於硬盤上

 

而session的Cookie是存在於瀏覽器的進程中,那么這種Cookie我們稱為會話Cookie,

 

當我們重新打開瀏覽器窗口時,之前的Cookie中存放的Sessionid已經不存在了,此時

 

服務器從HttpServletRequest對象中沒有檢查到sessionid,服務器會再發送一個新的存

 

有Sessionid的Cookie到客戶端的瀏覽器中,此時對應的是一個新的會話,而服務器上

 

原先的session等到它的默認時間到之后,便會自動銷毀。

 

以上既是為何找不到session的原因,如何解決?

可以在登錄的時候,手動把JSESSIONID保存到COOKIE中,並令其存在的生命周期更長(可以和session的生命周期保持一致),這樣即使瀏覽器關閉,cookie也不會消失,JSESSIONID還在,服務器即可再找到該session,具體代碼如下:

HttpSession session=request.getSession();
String sessionid=session.getId();
Cookie cookie=new Cookie("JSESSIONID",sessionid);
cookie.setMaxAge(30*60);
response.addCookie(cookie);
 
 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM