2019-06-10

Session

HttpSession 對象是 javax.servlet.http.HttpSession 的實例,該接口并不像

HttpServletRequest 或 HttpServletResponse 還存在一個父接口,該接口只是一個

純粹的接口。這因為 session 本身就屬于 HTTP 協(xié)議的范疇。

對于服務(wù)器而言,每一個連接到它的客戶端都是一個 session,servlet 容器

使用此接口創(chuàng)建 HTTP 客戶端和 HTTP 服務(wù)器之間的會話。會話將保留指定的時間段,跨多個連接或來自用戶的頁面請求。

session 無論客戶端還是服務(wù)器端都可以感知到,若重新打開一個新的瀏覽器,則無法取得之前設(shè)置的 session,因為每一個 session 只保存在當(dāng)前的瀏覽器當(dāng)中,并在相關(guān)的頁面取得。

Session的作用

Session 的作用就是為了標(biāo)識一次會話,或者說確認(rèn)一個用戶;并且在一次

會話(一個用戶的多次請求)期間共享數(shù)據(jù)。我們可以通過 req.getSession()方

法,來獲取當(dāng)前會話的 session 對象。

HttpSession? session= req.getSession();

標(biāo)識會話JSESSIONID

Session 既然是為了標(biāo)識一次會話,那么此次會話就應(yīng)該有一個唯一的標(biāo)志,

這個標(biāo)志就是 sessionId。

每當(dāng)一次請求到達(dá)服務(wù)器,如果開啟了會話(訪問了 session),服務(wù)器第一

步會查看是否從客戶端回傳一個名為 JSESSION 的 cookie,如果沒有則認(rèn)為這是

一次新的會話,會創(chuàng)建 一個新的 session 對象,并用唯一的 sessionId 為此次

會話做一個標(biāo)志。

這里提到一個叫做 JSESSION 的 cookie,這是一個比較特殊的 cookie,當(dāng)用

戶請求服務(wù)器時,如果訪問了 session,則服務(wù)器會創(chuàng)建一個名為 JSESSION,值

為獲取到的 session(無論是獲取到的還是新創(chuàng)建的)的 sessionId 的 cookie 對

象,并添加到 response 對象中,響應(yīng)給客戶端,有效時間為關(guān)閉瀏覽器。

所以 Session 的底層依賴 Cookie 來實現(xiàn)。

作為域?qū)ο?/p>

Session 用來表示一次會話,在一次會話中數(shù)據(jù)是可以共享的,這時 session

作為域?qū)ο蟠嬖冢梢酝ㄟ^ setAttribute(name,value);方法向域?qū)ο笾刑砑訑?shù)據(jù),

通過 getAttribute(name) 從域?qū)ο笾蝎@取數(shù)據(jù),通過 removeAttribute(name)從域

對象中移除數(shù)據(jù)。

數(shù)據(jù)存儲在 session 域?qū)ο笾?,?dāng) session 對象不存在了,或者是兩個不同

的 session 對 象時,數(shù)據(jù)也就不能共享了。這就不得不談到 session 的生命周期。

Session的周期

當(dāng)客戶端第一次請求 servlet 并且操作 session 時,session 對象生成,

Tomcat 中 session 默認(rèn)的存活時間為 30min,即你不操作界面的時間,一旦有

操作,session 會重新計時。

可以在 Tomcat 中的 web.xml 文件中進(jìn)行修改生命周期。

當(dāng)然除了以上的修改方式外,我們也可以在程序中自己設(shè)定 session 的生命

周期,通過 session.setMaxInactiveInterval(int);來設(shè)定 session 的最大不活動時間,

單位為秒。

HttpSession? ? session? =? rep.getSession();

Session.setMaxInactiveInterval(5);

當(dāng)然我們也可以通過 getMaxInactiveInterval();方法來查看當(dāng)前 Session 對

象的最大不活動時間。

或者我們也可以通過 session.invalidate();方法讓 session 立刻失效。

Session.invalidate();

從前面的 JESSION 可知道,session 的底層依賴 cookie 實現(xiàn),并且該 cookie

的有效時間為關(guān)閉瀏覽器,從而 session 在瀏覽器關(guān)閉時也相當(dāng)于失效了(因為

沒有 JSESSION 再與之對應(yīng))。

當(dāng)非正常關(guān)閉服務(wù)器時,session 銷毀;當(dāng)正常關(guān)閉服務(wù)器時,Session 將被

序列化到磁盤上,在工作空間 work 目錄下的 SESSION.ser 文件中,下次啟動服

務(wù)時,自動加載到內(nèi)存。

Session 失效則意味著此次會話結(jié)束,數(shù)據(jù)共享結(jié)束。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容