Web開發學習筆記:Session會話管理(已完成)

這篇文章是本人的學習筆記,主要學習資料是JSP&Servlet學習筆記(第三版),林信良著,清華大學出版社出版


Web開發學習筆記:Session會話管理

session大家都知道用於會話管理,Servlet中常用就是獲取session(request.getSession()),session屬性的讀取(setAttribute(),getAttribute()),令session失效(invalidate())等。這篇筆記不再介紹這些方法常用且基礎的東西,而是回去說較爲深入一些的東西。

一、HttpSession原理和試用注意事項

session這東西並不是屬於http協議,畢竟http是無狀態的協議。

只不過爲了實現一些業務場景,多次網頁的訪問還是需要記錄一些信息的,既然http不能記錄信息,那容器可以啊,所以session是容器搞出來的。

容器的本質就是Java程序,裏面的HttpServletRequest,HttpServletResponse等也都是一個個Java對象,session也不例外。所以session是存儲在容器中的,並且容器還負責管理session的生命週期。

每個session都有自己的sessionId,我們通過getId()就能獲取到,這個id用來標識session。
一個用戶在遠程瀏覽器上登錄服務器,登錄成功後,服務器會爲這個用戶(瀏覽器)創建一個session,這個session的專屬sessionId也會自動生成存儲在這個session之中,同時,這個sessionId也會存儲在遠程瀏覽器的cookie之中。

這樣,當用戶再次訪問服務器時,cookie中的sessionId會跟着請求一起傳給服務器。服務器就可以根據這個sessionId來檢查是否有對應的session對象。

以上就是session實現會話的原理。



因爲session是存儲在服務器上的Java對象,所以使用session傳值的時候,不用存儲體量打的數據。

所以當服務器重啓後,所有的session都會失效(爲了防止這個,我們可以在重啓前將所有的session對象序列化存儲到硬盤中,重啓後在從硬盤中恢復session)。這裏要明白的是,服務器重啓,失效的是session,遠程瀏覽器中的cookie的sessionId並沒有失效,只是根據這個sessionId再也找不到對應的session了。

說道session失效,我們手動設定session失效時間。
setMaxInactivaInterval(),這個方法設定的是瀏覽器多久沒有請求服務器的話,這個瀏覽器對應的session就會自動失效,單位是秒。這個方法設定的是服務器中的session失效的時間,不是瀏覽器中cookie裏sessionId的失效時間。

除了使用上面那個方法,還可以設置web.xml來實現。

<web-app>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>

不過上面的單位不是秒,是分鐘。

如果想要設置cookie中sessionId的存活時間,可以使用Servlet 3.0的SessionCookieConfig接口,這個以後再寫吧。

二、HttpSession與URL重寫

從上面的筆記中可以瞭解,session是基於cookie實現的。如果用戶在瀏覽器禁用cookie,那麼seesion就無法實現。

在這樣的情況下,如果還要用session來進行會話管理,那還可以使用URL重寫。URL重寫說白了,就是將sessionId放到地址後進行傳參,將sessionId以get方式傳遞。

在HttpServletResponse中有encodeURL()這個方法幫我們自動進行URL重寫。
在這裏插入圖片描述
該方法的參數是準備重寫的地址。如果服務器無法從cookie中獲取到sessionId(多半是瀏覽器禁用id引起的),那麼encodeURL()會將sessionId加入到地址中返回;如果服務器可以從cookie中取到sessionId,那麼久encode會直接返回地址,不做任何處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章