今天想和你們分享一個關於Session的話題: 當瀏覽器關閉時,Session就被銷燬了?瀏覽器
咱們知道Session是JSP的九大內置對象(也叫隱含對象)中的一個,它的做用是能夠保服務器
存當前用戶的狀態信息,初學它的時候,認爲Session的生命週期是從打開一個瀏覽器窗session
口發送請求到關閉瀏覽器窗口,但其實這種說法是不正確的!下面就具體的去解釋:ide
當用戶第一次訪問Web應用中支持Session的某個網頁時,就會開始一個新的Session,spa
那麼接下來當用戶瀏覽這個Web應用的不一樣網頁時,始終處於一個Session中orm
再詳細些:對象
當一個Session開始時,Servlet容器會建立一個HttpSession對象,那麼在HttpSession對象中,能夠存放用戶狀態的信息生命週期
Servlet容器爲HttpSession對象分配一個惟一標識符即Sessionid,Servlet容器把Sessionid做爲一種Cookie保存在客戶端的 *瀏覽器* 中進程
用戶每次發出Http請求時,Servlet容器會從HttpServletRequest對象中取出Sessionid,而後根據這個Sessionid找到相應的HttpSession對象,從而獲取用戶的狀態信息開發
以上就是Session的運行機制,可是尚未提到Session的生命週期,再往下了解!
其實讓Session結束生命週期,有如下兩種辦法:
一個是Session.invalidate()方法,不過這個方法在實際的開發中,並不推薦,可能在強制註銷用戶的時候會使用;
一個是當前用戶和服務器的交互時間超過默認時間後,Session會失效
咱們知道Session是存在於服務器端的,當把瀏覽器關閉時,瀏覽器並無向服務器發送
任何請求來關閉Session,天然Session也不會被銷燬,可是能夠作一點努力,在全部的
客戶端頁面裏使用js的window.onclose來監視瀏覽器的關閉動做,而後向服務器發送一
個請求來關閉Session,可是這種作法在實際的開發中也是不推薦使用的,最正常的辦法
就是不去管它,讓它等到默認的時間後,自動銷燬
那麼爲何當咱們關閉瀏覽器後,就再也訪問不到以前的session了呢?
其實以前的Session一直都在服務器端,而當咱們關閉瀏覽器時,此時的Cookie是存在
於瀏覽器的進程中的,當瀏覽器關閉時,Cookie也就不存在了。
其實Cookie有兩種:
一種是存在於瀏覽器的進程中;
一種是存在於硬盤上
而session的Cookie是存在於瀏覽器的進程中,那麼這種Cookie咱們稱爲會話Cookie,
當咱們從新打開瀏覽器窗口時,以前的Cookie中存放的Sessionid已經不存在了,此時
服務器從HttpServletRequest對象中沒有檢查到sessionid,服務器會再發送一個新的存
有Sessionid的Cookie到客戶端的瀏覽器中,此時對應的是一個新的會話,而服務器上
原先的session等到它的默認時間到以後,便會自動銷燬。
ps:
當在同一個瀏覽器中同時打開多個標籤,發送同一個請求或不一樣的請求,還是同一個session;
當不在同一個窗口中打開相同的瀏覽器時,發送請求,還是同一個session;
當使用不一樣的瀏覽器時,發送請求,即便發送相同的請求,是不一樣的session;
當把當前某個瀏覽器的窗口全關閉,再打開,發起相同的請求時,就是本文所闡述的,是不一樣的session,可是它和session的生命週期是沒有關係的.