瀏覽器關閉後,Session就銷燬了嗎?
我們知道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;
當不在同一個視窗中開啟相同的瀏覽器時,傳送請求,仍是同一個session;
當使用不同的瀏覽器時,傳送請求,即使傳送相同的請求,是不同的session;
當把當前某個瀏覽器的視窗全關閉,再開啟,發起相同的請求時,是不同的session。