最近碰到一個問題,統計在線人數,初步想法能將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,具體代碼如下:
