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