­

瀏覽器關閉後Session真的消失了嗎?

  • 2019 年 10 月 6 日
  • 筆記

今天想和大家分享一個關於Session的話題: 當瀏覽器關閉時,Session就被銷毀了?

我們知道Session是JSP的九大內置對象(也叫隱含對象)中的一個,它的作用是可以保

存當前用戶的狀態資訊,初學它的時候,認為Session的生命周期是從打開一個瀏覽器窗

口發送請求到關閉瀏覽器窗口,但其實這種說法是不正確的!下面就具體的去解釋:

當用戶第一次訪問伺服器web應用程式中支援session的某個程式的時候,客戶端(瀏覽器)的請求頭cookie屬性中沒有JSESSIONID資訊,那麼伺服器接收到請求後執行了getSession()方法,首先會判斷是否有JSESSIONID,如果不存在的話,就只姐創建一個新的Session,存在的話就會通過jSESSIONID取出對應的Session。

再詳細些:

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

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

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

以上就是Session的運行機制,但是還沒有提到Session的生命周期,再往下了解!

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

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

一個是當前用戶和伺服器的交互時間超過默認時間後Session會失效

session.setMaxInactiveInterval(int seconds);//秒為單位

我們知道Session是存在於伺服器端的,當把瀏覽器關閉時,瀏覽器並沒有向伺服器發送

任何請求來關閉Session,自然Session也不會被銷毀,但是可以做一點努力,在所有的

客戶端頁面里使用JavaScript中的window.onclose來監視瀏覽器的關閉動作,然後向伺服器發送一個請求來關閉Session,但是這種做法在實際的開發中也是不推薦使用的,最正常的辦法就是不去管它,讓它等到默認的時間後,自動銷毀

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

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

於瀏覽器的進程中的(存放在記憶體中),當瀏覽器關閉時自然Cookie也就不存在了。

其實Cookie有兩種:

一種是存在於瀏覽器的進程中(記憶體中)

一種是存在於硬碟上

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

當我們重新打開瀏覽器窗口時,之前的Cookie中存放的Sessionid已經不存在了,此時伺服器從HttpServletRequest對象中的請求頭裡面沒有檢查到sessionid,伺服器會再響應給客戶端一個新的存有Sessionid的Cookie標識(JSESSIONID)到客戶端的瀏覽器中,此時對應的是一個新的會話,而伺服器上原先的session等到它的默認時間到之後,便會自動銷毀

PS:

按照以上定理,我們可以設想一下,如果我們獲取了某一個用戶的JSESSIONID,那麼我們是不是可以通過某些方式來把這個Session ID 寫入到我們的瀏覽器中,來偽造對方呢?