天天看點

浏覽器關閉後,Session就銷毀了嗎?

話題:

       當浏覽器關閉後,Session就銷毀了嗎?

答案:

JSESSIONID(sessionid)消失了,但是伺服器中存放的sessionid并沒有立馬銷毀。

分析:

       我們知道Session是JSP的九大内置對象(也叫隐含對象)中的一個,它的作用是可以儲存目前使用者的狀态資訊,初學它的時候,認為Session的生命周期是從打開一個浏覽器視窗發送請求到關閉浏覽器視窗,但其實這種說法是不正确的!當一個Session開始時,Servlet容器會建立一個HttpSession對象,那麼在HttpSession對象中,可以存放使用者狀态的資訊,Servlet容器為HttpSession對象配置設定一個唯一辨別符即Sessionid,Servlet容器把Sessionid作為一種Cookie儲存在用戶端的浏覽器 中使用者每次發出Http請求時,Servlet容器會從HttpServletRequest對象中取出Sessionid,然後根據這個Sessionid找到相應的HttpSession對象,進而擷取使用者的狀态資訊。

       其實讓Session結束生命周期,有以下兩種辦法:

       一個是Session.invalidate()方法,不過這個方法在實際的開發中,并不推薦,可能在強制登出使用者的時候會使用;

       一個是目前使用者和伺服器的互動時間超過預設時間後,Session會失效。

       我們知道Session是存在于伺服器端的,當把浏覽器關閉時,浏覽器并沒有向伺服器發送任何請求來關閉Session,自然Session也不會被銷毀,但是可以做一點努力,在所有的用戶端頁面裡使用js的window.onclose來監視浏覽器的關閉動作,然後向伺服器發送一個請求來關閉Session,但是這種做法在實際的開發中也是不推薦使用的,最正常的辦法就是不去管它,讓它等到預設的時間後,自動銷毀。那麼為什麼當我們關閉浏覽器後,就再也通路不到之前的session了呢?其實之前的Session一直都在伺服器端,而當我們關閉浏覽器時,此時的Cookie是存在于浏覽器的程序中的,當浏覽器關閉時,Cookie也就不存在了。

       其實Cookie有兩種:

       一種是存在于浏覽器的程序中;

       一種是存在于硬碟上。

       而session的Cookie是存在于浏覽器的程序中,那麼這種Cookie我們稱為會話Cookie,當我們重新打開浏覽器視窗時,之前的Cookie中存放的Sessionid已經不存在了,此時伺服器從tpServletRequest對象中沒有檢查到sessionid,伺服器會再發送一個新的存有Sessionid的Cookie到用戶端的浏覽器中,此時對應的是一個新的會話,而伺服器上原先的session等到它的預設時間到之後,便會自動銷毀。

附加:

當在同一個浏覽器中同時打開多個标簽,發送同一個請求或不同的請求,仍是同一個session;

繼續閱讀