Web應用狀態管理(Session)
Session
Session物件的原理在於,伺服器可以為客戶端建立並維護一個Session物件,用於存放資料。在建立Session物件的同時,伺服器將會為該Session物件產生唯一編號,這個編號稱之為SessionID,伺服器以Cookie的方式將SessionID存放在客戶端。當瀏覽器再次訪問該伺服器時,會將SessionID作為Cookie資訊待帶到伺服器,伺服器可以通過該SessionID檢索到以前的Session物件,並對其進行訪問。需要注意的是,此時Cookie中僅僅儲存了一個SessionID,而相對較多的會話資料儲存在伺服器端對應的Session物件中,由伺服器統一維護,這樣一定程度保證了會話資料的安全性,但增加了伺服器端的記憶體開銷。
存放在客戶端的用於儲存SessionID的Cookie會在瀏覽器關閉時清除。我麼把使用者開啟一個瀏覽器訪問某個應用開始,到關閉瀏覽器為止的互動過程成為一個”會話“在一個”會話“過程中,可能會向同一個應用發出了多次請求,這些請求將共享一個Session物件,因為這些請求攜帶了相同的SessionID資訊。
Session會話跟蹤機制
當客戶端第一個傳送請求到伺服器時通過
HttpSession session = request.getSession();
為客戶端建立一個Session物件。
如何判斷是否是一個新會話呢?使用isNew()方法。
getSession(false)方法使用已經存在的會話,而不必建立新會話,預設為true。
當用戶請求之後伺服器將SessionID設定在Cookie中返回給客戶端,如:
Set-Cookie: JSESSIONID=3453597CE6EA6B4F948C09D67530F2C0;
客戶端再次傳送請求的時候:cookie就將SessionID作為請求頭的資訊傳送到伺服器,如:
Cookie: JSESSIONID=3453597CE6EA6B4F948C09D67530F2C0
HttpSession介面:
HttpSession介面常用的一些方法
setAttribute(java.lang.String, java.lang.Object):在Session物件中用一個名字繫結一個物件。
getAttribute(java.lang.String):通過名字獲取Session物件中儲存的物件。
removeAttribute(java.lang.String):在Session中刪除與一個名字對應的物件。
getCreationTime():返回第一次建立會話的時間。
getLastAccessedTime():返回容器最後一次得到該會話ID的請求時間。
setMaxInactiveInterval(int interval):對於會話指定客戶請求的最大間隔時間,以秒為單位。-1表示永不過期
getMaxInactiveInterval(int interval):返回客戶請求的最大間隔時間。
invalidate():會話結束,當前存在在會話中的所有會話屬性也會解除繫結。
getId():此方法返回每個session唯一的標識
會話超時管理
銷燬會話可以採用如下三種簡單的方式
設定會話超時。
在Session物件上呼叫invalidate()方法。
應用結束(崩潰或取消部署)
在web.xml檔案中配置
< session-config >
< session-timeout >15(以分鐘為單位)</ session-timeout >
< /session-config>
Application與Session域範圍的屬性比較
在web應用上下文域範圍和Session域範圍中,都可以用一個名字來繫結一個物件,從而在域範圍內進行訪問
繫結在Session範圍內的物件僅僅在一個持續的會話期間被維護
繫結在Application(應用上下文)中的物件,在整個Web應用程式執行過程中都被維護。
都使用相同的方法:setAttribute() getAttribute()