在上一篇文章《一文搞清楚Cookie概念和難點》中的最後,我提出cookie的一系列的問題,那麼今天我們就從這個這些問題入手,看看後來之秀如何超越自己的前輩的。
上篇文章寫道一個超市購物辦卡的場景:
我說可以,然後錄入自己的信息。帶著超市的卡回家了。
這個時候超市並沒有保存我的信息,所有的信息都是存儲在我的卡片中(早期的購物系統是這樣的),只有當我把卡帶回來的時候,我消費纔能夠給我添加積分,如果沒有帶卡是積不了分的。
姑且不論設計如何,看看Session的機制就知道後者是比較優秀。
還是一個購物場景:
超市更換了一套更為高級的客戶管理系統。錄入用戶信息,超市會員系統會保存一份,然後給我張卡,同時告訴我記住我的卡號,下次不用帶卡也可以積分。我很開心,背下卡號,再次消費的時候就可以無卡積分了。
超市更換了一套更為高級的客戶管理系統。
實現的原理:
當用戶第一次訪問我們的伺服器的時候,我們會隨機的分給用戶一個JSESSIONID=C9423A308AF02F61FC93C20D91F032B0,並且保存在用戶的cookie中,同時在服務端則保存著這個session的具體信息,比如用戶的登錄信息。每一次訪問的我們隨著請求帶過去,那麼我們就知道本次請求時那個用戶在訪問。
JSESSIONID=C9423A308AF02F61FC93C20D91F032B0
當用戶第一次請求servlet的時候,相應頭會告訴cookie添加一個JSESSIONID:
2. 服務端獲取Session
使用request. getSession() :返回請求的Session對象,如果request中沒有Session信息,name就會返回一個Session給客戶端。
request. getSession()
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")
1.Session的命名規範:
一般的情況下我們都會使用字母大寫,多個字母使用_相連:
EMPLOYEE_INSESSION,USER_IN_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依然存在於服務端.
removeAttribute("key")
Session的銷毀則是在服務端刪除Session空間.
當瀏覽器關閉的時候JSESSIONID就會被刪除,再次訪問的時候,我們就會獲得一個全新的session, 但是上一個session 依然在我們的內存中,只有當自己生命週期結束後才會刪除.
JSESSIONID
session
4.Session的生命週期:
伺服器管理Session的生命週期,默認是30分鐘,就是當你在伺服器沒有活動開始計算,30分鐘之後,伺服器刪除對應的Session.
當然我們可以修改,默認值.也可以使用setMaxInactiveInterval(int interval) ,可以手動的設置session的存活時間.
setMaxInactiveInterval(int interval)
Session也是通過Cookie去傳遞JSESSIONID的,但是如果用戶禁用了Cookie我們該怎麼辦呢?
1. 手動的拼接jsessionid
jsessionid
這也是比較原始的值傳遞的方式,就是在URL地址上拼接我們的 jsessionid ,將這個參數帶到我們的伺服器,就可以找到我們伺服器相對應的session了.
2.使用response.encodeURL(url)讓伺服器自動拼接jsessionid.
response.encodeURL(url)
我們使用responsee.encodeURL("url")來獲取url更加方便,並且也更加的智能,當用戶禁用了Cookie的時候,我們才會把jsessionid 拼接上去,如果沒有的話,我們的url還是最簡潔的方式呈現.
responsee.encodeURL("url")
Cookie
url
關於session的內容,我就整理到這裡,以後也會逐漸分享自己在實際工作中session遇到的問題以及解決方案分享出來,不僅僅能夠給自己提個醒,也希望能夠幫助各位同學吧.
推薦閱讀: