Session的銷毀方式到底有哪些?

Session,作為我們離不開的后臺的技術(shù),它的出現(xiàn)主要是為了解決 Http 協(xié)議的無狀態(tài)特點(diǎn),用于解決用戶狀態(tài)的存儲問題,而往往對于存儲來說都會涉及到一個時間問題,下面我們來看看它的銷毀方式到底有哪些。

銷毀的方式

  • 默認(rèn)時間到期

  • 自己設(shè)定到期時間

  • 立刻失效

  • 關(guān)閉瀏覽器

  • 關(guān)閉服務(wù)器

案例實(shí)操

默認(rèn)時間到期

當(dāng)客戶端第一次請求 servlet 并且操作 session 時,session 對象生成,以 Tomcat 為例,Tomcat 中 session 默認(rèn)的存活時間為 30min,即你不操作界面的時間,一旦有操作,session 會重新計(jì)時。那么 session 的默認(rèn)時間可以改么?答案是肯定的??梢栽?Tomcat 中的 web.xml 文件中進(jìn)行修改。如下圖:

image

自己設(shè)定到期時間

當(dāng)然除了以上的修改方式外,我們也可以在程序中自己設(shè)定 session 的生命周期,通過 session.setMaxInactiveInterval(int); 來設(shè)定 session 的最大不活動時間,單位為秒。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n78" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">HttpSession session = req.getSession();
session.setMaxInactiveInterval(5);</pre>

當(dāng)然我們也可以通過 getMaxInactiveInterval(); 方法來查看當(dāng)前 Session 對象的最大不活動時間。

立刻失效

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

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n83" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">session.invalidate();</pre>

關(guān)閉瀏覽器

session 的底層依賴 cookie 實(shí)現(xiàn),因?yàn)椴煌脩粼L問服務(wù)器要判別到底是使用哪個 session,所以當(dāng)用戶第一次訪問服務(wù)器的時候往往會把一個 session id 通過 cookie 存儲到用戶端,并且該 cookie 的有效時間為關(guān)閉瀏覽器,從而 session 在瀏覽器關(guān)閉時也相當(dāng)于失效了(因?yàn)闆]有 session id 再與之對應(yīng))。如下圖,關(guān)閉后再打開,重新給瀏覽器分配了個 session id。

image-20200708195027943

需要注意的是這里只是 cookie 失效了,你再訪問相當(dāng)于服務(wù)器把你當(dāng)成了新用戶,又給你創(chuàng)建了一個 session,并沒有把之前的 session 對象銷毀。

關(guān)閉服務(wù)器

當(dāng)非正常關(guān)閉服務(wù)器時,session 銷毀;當(dāng)正常關(guān)閉服務(wù)器時,session 將被序列化到磁盤上,在工作空間 work 目錄下的 SESSION.ser 文件中,如果對象被保存在了 session 中,服務(wù)器在關(guān)閉時要把對象序列化到硬盤,這個對象就必須實(shí)現(xiàn) Serializable 接口,下次啟動服務(wù)時,自動加載到內(nèi)存。如下圖,正常關(guān)閉后可以看到文件夾中多了一個 SESSIONS.ser 文件,再次啟動服務(wù)器則文件消失。

image

擴(kuò)展~Cookie的銷毀

image

從圖中除了看到 Cookie 的名稱和內(nèi)容外,我們還需要關(guān)心一個信息,到期時間,到期時間用來指定該 cookie 何時失效。默認(rèn)為當(dāng)前瀏覽器關(guān)閉即失效。我們可以手動設(shè)定 cookie 的有效時間(通過到期時間計(jì)算),通過 setMaxAge(int expiry); 方法設(shè)定 cookie 的最大有效時間,以為單位。

  • 大于 0 的整數(shù),表示存儲的秒數(shù);若為負(fù)數(shù),則表示不存儲該 cookie;若為 0,則刪除該 cookie。

  • 負(fù)整數(shù):cookie 的 maxAge 屬性的默認(rèn)值就是 -1,表示只在瀏覽器內(nèi)存中存活,一旦關(guān)閉瀏覽器窗口,那么 cookie 就會消失。

  • 正整數(shù):表示 cookie 對象可存活指定的秒數(shù)。當(dāng)生命大于 0 時,瀏覽器會把 Cookie 保存到硬盤上,就算關(guān)閉瀏覽器,就算重啟客戶端電腦,cookie 也會存活相應(yīng)的時間。

  • :cookie 生命等于 0 是一個特殊的值,它表示 cookie 被作廢!也就是說,如果原來瀏覽器已經(jīng)保存了這個 Cookie,那么可以通過 Cookie 的 setMaxAge(0) 來刪除這個 Cookie。 無論是在瀏覽器內(nèi)存中,還是在客戶端硬盤上都會刪除這個 Co

?著作權(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)容