在上一篇文章《一文搞清楚Cookie概念和難點》中的最後,我提出cookie的一系列的問題,那麼今天我們就從這個這些問題入手,看看後來之秀如何超越自己的前輩的。

一:Session的原理

上篇文章寫道一個超市購物辦卡的場景:

我說可以,然後錄入自己的信息。帶著超市的卡回家了。

這個時候超市並沒有保存我的信息,所有的信息都是存儲在我的卡片中(早期的購物系統是這樣的),只有當我把卡帶回來的時候,我消費纔能夠給我添加積分,如果沒有帶卡是積不了分的。

姑且不論設計如何,看看Session的機制就知道後者是比較優秀。

還是一個購物場景:

超市更換了一套更為高級的客戶管理系統。

錄入用戶信息,超市會員系統會保存一份,然後給我張卡,同時告訴我記住我的卡號,下次不用帶卡也可以積分。我很開心,背下卡號,再次消費的時候就可以無卡積分了。

實現的原理:

當用戶第一次訪問我們的伺服器的時候,我們會隨機的分給用戶一個JSESSIONID=C9423A308AF02F61FC93C20D91F032B0,並且保存在用戶的cookie中,同時在服務端則保存著這個session的具體信息,比如用戶的登錄信息。每一次訪問的我們隨著請求帶過去,那麼我們就知道本次請求時那個用戶在訪問。

二:Session的操作

1.客戶端設置Session:

當用戶第一次請求servlet的時候,相應頭會告訴cookie添加一個JSESSIONID:

響應中頭告訴請求應該設置一個JSESSIONID

2. 服務端獲取Session

使用request. getSession() :返回請求的Session對象,如果request中沒有Session信息,name就會返回一個Session給客戶端。

3.往Session中存儲數據

session.setAttribute(String name, Object value);
session.setAttribute("username", "cunkoudelaowang");

屬性名是一個字元串,而存儲的對象則可以是一個對象。相對於cookie更加方便我們的存儲.

4.從Session中移除數據.

session.removeAttribute(String name);

session.removeAttribute("username");

5.獲取Session中的數據.

Object obj = session.getAttribute(String name);

session.getAttribute("username")

三:Session的一些細節

1.Session的命名規範:

一般的情況下我們都會使用字母大寫,多個字母使用_相連:

EMPLOYEE_INSESSION,USER_IN_SESSION等.

2.Session的儲存內容:

剛才我們也看了,在設置session屬性的時候,我們存儲的是Object對象,也就是說我們可以儲存對象,這對我們開發者提供了更多方便.

//在session中存儲User對象
session.setAttribute("USER_IN_SESSION", User);

3.Session的銷毀和刪除:

Session是存儲在服務端的,removeAttribute("key")只是刪除了該session的key對應的屬性值,但是Session依然存在於服務端.

Session的銷毀則是在服務端刪除Session空間.

當瀏覽器關閉的時候JSESSIONID就會被刪除,再次訪問的時候,我們就會獲得一個全新的session, 但是上一個session 依然在我們的內存中,只有當自己生命週期結束後才會刪除.

4.Session的生命週期:

伺服器管理Session的生命週期,默認是30分鐘,就是當你在伺服器沒有活動開始計算,30分鐘之後,伺服器刪除對應的Session.

設置Session的過期時間

當然我們可以修改,默認值.也可以使用setMaxInactiveInterval(int interval) ,可以手動的設置session的存活時間.

四:Cookie禁用和URL重寫

Session也是通過Cookie去傳遞JSESSIONID的,但是如果用戶禁用了Cookie我們該怎麼辦呢?

Google瀏覽器上禁用Cookie

1. 手動的拼接jsessionid

這也是比較原始的值傳遞的方式,就是在URL地址上拼接我們的 jsessionid ,將這個參數帶到我們的伺服器,就可以找到我們伺服器相對應的session了.

2.使用response.encodeURL(url)讓伺服器自動拼接jsessionid.

自動拼接jsessionid

我們使用responsee.encodeURL("url")來獲取url更加方便,並且也更加的智能,當用戶禁用了Cookie的時候,我們才會把jsessionid 拼接上去,如果沒有的話,我們的url還是最簡潔的方式呈現.

關於session的內容,我就整理到這裡,以後也會逐漸分享自己在實際工作中session遇到的問題以及解決方案分享出來,不僅僅能夠給自己提個醒,也希望能夠幫助各位同學吧.

推薦閱讀:

相關文章