我們知道Session是JSP的九大內(nèi)置對象(也叫隱含對象)中的一個,它的作用是可以保存當(dāng)前用戶的狀態(tài)信息,初學(xué)它的時候,認(rèn)為Session的生命周期是從打開一個瀏覽器窗口發(fā)送請求到關(guān)閉瀏覽器窗口,但其實(shí)這種說法是不正確的!當(dāng)一個Session開始時,Servlet容器會創(chuàng)建一個HttpSession對象,那么在HttpSession對象中,可以存放用戶狀態(tài)的信息,Servlet容器為HttpSession對象分配一個唯一標(biāo)識符即Sessionid,Servlet容器把Sessionid作為一種Cookie保存在客戶端的瀏覽器 中用戶每次發(fā)出Http請求時,Servlet容器會從HttpServletRequest對象中取出Sessionid,然后根據(jù)這個Sessionid找到相應(yīng)的HttpSession對象,從而獲取用戶的狀態(tài)信息。 其實(shí)讓Session結(jié)束生命周期,有以下兩種辦法: 一個是Session.invalidate()方法,不過這個方法在實(shí)際的開發(fā)中,并不推薦,可能在強(qiáng)制注銷用戶的時候會使用; 一個是當(dāng)前用戶和服務(wù)器的交互時間超過默認(rèn)時間后,Session會失效。 我們知道Session是存在于服務(wù)器端的,當(dāng)把瀏覽器關(guān)閉時,瀏覽器并沒有向服務(wù)器發(fā)送任何請求來關(guān)閉Session,自然Session也不會被銷毀,但是可以做一點(diǎn)努力,在所有的客戶端頁面里使用js的window.onclose來監(jiān)視瀏覽器的關(guān)閉動作,然后向服務(wù)器發(fā)送一個請求來關(guān)閉Session,但是這種做法在實(shí)際的開發(fā)中也是不推薦使用的,最正常的辦法就是不去管它,讓它等到默認(rèn)的時間后,自動銷毀。那么為什么當(dāng)我們關(guān)閉瀏覽器后,就再也訪問不到之前的session了呢?其實(shí)之前的Session一直都在服務(wù)器端,而當(dāng)我們關(guān)閉瀏覽器時,此時的Cookie是存在于瀏覽器的進(jìn)程中的,當(dāng)瀏覽器關(guān)閉時,Cookie也就不存在了。 其實(shí)Cookie有兩種: 一種是存在于瀏覽器的進(jìn)程中; 一種是存在于硬盤上。 而session的Cookie是存在于瀏覽器的進(jìn)程中,那么這種Cookie我們稱為會話Cookie,當(dāng)我們重新打開瀏覽器窗口時,之前的Cookie中存放的Sessionid已經(jīng)不存在了,此時服務(wù)器從tpServletRequest對象中沒有檢查到sessionid,服務(wù)器會再發(fā)送一個新的存有Sessionid的Cookie到客戶端的瀏覽器中,此時對應(yīng)的是一個新的會話,而服務(wù)器上原先的session等到它的默認(rèn)時間到之后,便會自動銷毀。 附加:當(dāng)在同一個瀏覽器中同時打開多個標(biāo)簽,發(fā)送同一個請求或不同的請求,仍是同一個session; 當(dāng)不在同一個窗口中打開相同的瀏覽器時,發(fā)送請求,仍是同一個session; 當(dāng)使用不同的瀏覽器時,發(fā)送請求,即使發(fā)送相同的請求,是不同的session; 當(dāng)把當(dāng)前某個瀏覽器的窗口全關(guān)閉,再打開,發(fā)起相同的請求時,是不同的session。 |
|