Session的基本原理以及操作 在上一篇文章《一文搞清楚Cookie概念和難點》中的最後,我提出cookie的一系列的問題,那麼今天我們就從這個這些問題入手,看看後來之秀如何超越自己的前輩的。 一:Session的原理 上篇文章寫道一個超市購物辦卡的場景: 我說可以,然後錄入自己的信息。帶著超市的卡回家了。 這個時候超市並沒有保存我的信息,所有的信息都是存儲在我的卡片中(早期的購物系統是這樣的),只有當我把卡帶回來的時候,我消費纔能夠給我添加積分,如果沒有帶卡是積不了分的。姑且不論設計如何,看看Session的機制就知道後者是比較優秀。還是一個購物場景: 超市更換了一套更為高級的客戶管理系統。錄入用戶信息,超市會員系統會保存一份,然後給我張卡,同時告訴我記住我的卡號,下次不用帶卡也可以積分。我很開心,背下卡號,再次消費的時候就可以無卡積分了。 實現的原理:當用戶第一次訪問我們的伺服器的時候,我們會隨機的分給用戶一個JSESSIONID=C9423A308AF02F61FC93C20D91F032B0,並且保存在用戶的cookie中,同時在服務端則保存著這個session的具體信息,比如用戶的登錄信息。每一次訪問的我們隨著請求帶過去,那麼我們就知道本次請求時那個用戶在訪問。 二:Session的操作 1.客戶端設置Session: 當用戶第一次請求servlet的時候,相應頭會告訴cookie添加一個JSESSIONID: 響應中頭告訴請求應該設置一個JSESSIONID2. 服務端獲取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瀏覽器上禁用Cookie1. 手動的拼接jsessionid 這也是比較原始的值傳遞的方式,就是在URL地址上拼接我們的 jsessionid ,將這個參數帶到我們的伺服器,就可以找到我們伺服器相對應的session了. 2.使用response.encodeURL(url)讓伺服器自動拼接jsessionid. 自動拼接jsessionid我們使用responsee.encodeURL("url")來獲取url更加方便,並且也更加的智能,當用戶禁用了Cookie的時候,我們才會把jsessionid 拼接上去,如果沒有的話,我們的url還是最簡潔的方式呈現.關於session的內容,我就整理到這裡,以後也會逐漸分享自己在實際工作中session遇到的問題以及解決方案分享出來,不僅僅能夠給自己提個醒,也希望能夠幫助各位同學吧. 推薦閱讀: 相關文章 {{#data}} {{title}} {{/data}}