[Servlet]會話追蹤技術

Session管理

Session管理也即是Session追蹤(會話追蹤)。因爲HTTP是無狀態的,所以WEB服務器無法知道HTTP這個請求是否訪問過。
對於Session保持狀態,有4種方法:

  • URL重寫
  • 隱藏域
  • cookie
  • HttpSession對象

URL重寫

URL重寫是種Session追蹤技術,需要將一個或者多個token作爲查詢字符串添加到一個url中。
token的格式一般爲鍵 = 值:
url?key1=value1&key2=value2&...&keyn=valuen
如果token不經過過多的URL四處攜帶,那麼URL重寫就比較合適。有些瀏覽器設置禁用cookie可以使用。
缺點:

  • Web瀏覽器對URL限制2000個字符
  • URL重寫對於靜態頁面比較費力
  • URL重寫必須在服務器端有效。所有鏈接必須帶值。
  • 某些字符,如&,空格等需要進行轉碼
  • 添加到URL部分的toke是可見的,所以這些token不能攜帶重要信息

隱藏域

利用隱藏域來保持狀態與URL重寫技術類似,但是不會將值添加到URL的後面。而是放在html表單的隱藏域中。這就技術可以提交更多的token。在不需要跨多個頁面時,才適合使用這種技術。
缺點:請求必須是表單所發出的。

與URL重寫和隱藏域都只適用於保持不需要跨越頁面的信息,如果這些信息需要跨很多頁面,那麼就很難實現了。cookie可以解決URL重寫和隱藏域無法解決的問題。
cookie自動的在Web服務器和瀏覽器間傳遞信息。cookie是作爲HTTP標籤頭嵌入的,傳輸是由HTTP協議處理。除此以外cookie還可以設置有效期限。對於Web瀏覽器,每個Web服務器最多可以設置20個cookie。
缺點:用戶可以設置是否禁用cookie
如果瀏覽器是第一次訪問Web服務器,那麼可以通過
Cookie cookie = new Cookie("name", "value");
然後將其添加到response,返回給Web瀏覽器,事實上可以完全不是瀏覽器。
resp.addCookie(cookie);
當瀏覽器再次發送對統一資源或者是同一服務器請求時,瀏覽器會把之前Web服務器發過來的cookie傳回去。cookie也可以通過JavaScript創建和刪除。
如果要訪問cookie,可以在調用HttpServletRequestgetCookies()方法,然後返回一個cookie數組。比如如何讀取userName的cookie

Cookie[] cookies = request.getCookies();
Cookie userNameCookie = null;
if(cookies != null) {
    for(Cookie cookie : cookies) {
        if(cookie.getName().equals("userName")) {
            userNameCookie = cookie;
            break;
        }
    }
}

HttpServletResonse類並沒有提供removeCookie()等類似的方法,對於cookie的操作方式也只有一種addCookie(),那麼如何移除掉cookie?
cookie自身的屬性中,有一個maxAge,這是用來決定cookie的有效期。
如果要使的cookie無效,只要將去這個cookie的maxAge值設置爲0,然後添加給response。

userNameCookie.setMaxAge(0);
resp.addCookie(userNameCookie);

需要注意的事,cookie是保存在瀏覽器的,即客戶端。

HttpSession對象

在所有session追蹤技術中,HttpSession對象是最強大的,功能多。HttpSession在用戶第一次訪問某個網站自動創建,通過HttpServletRequest的getSession()方法,可以獲得用戶的HttpSession。
getSession() 有兩個重載的方法:
HttpSession getSession()
HttpSession gerSession(boolean create)

無參的getSession()返回當前的session,沒有則創建一個返回。
有參數的getSession(boolean..) 根據設置的boolean值來決定,在沒有時,是否創建session。true的時候,創建返回。false的時候返回null。
可以使用getAttribute(key)/setAttribute(key,obj) 來獲得回話信息。與之前的三種session追蹤技術不同的是,HttpSession是保存在Web服務器端,所以是耗費內存的。所以只能將儘可能小的對象放入其中,對於保存在HttpSession裏面的內容一定要慎重。現代的Servlet容器可以在內存即將滿時,將HttpSession對象移到輔助設備,但是同樣會影響部分性能。
添加進HttpSession中的值可以是任何對象。可以選擇實現java.io.Serializable接口,以便必要時候序列化對象保存到輔助設備。
既然之前說的,HttpSesion是保存在Web服務器端的,並且由於HTTP是無狀態的,所以無法記得上一次請求和這一次請求是否同一用戶。那麼HttpSession的原理是什麼呢?
Servlet容器會爲其每一個HttpSession創建一個唯一的表示符,並且將這個token發送給瀏覽器。在Tomcat容器中,會生成一個名爲JESSIONID的cookie,或者使用URL重寫技術添加至URL中。
同cookie一樣的是,HttpSession也可以通過調用invalidate()方法強制是的Session過期,然後將Session綁定的對象解除綁定。
默認情況下,HttpSession會在用戶靜默一段時間後過期,可以通過WEB部署文件中設置session-timeout來設置session的過期時間。在Servlet中同樣可以通過HttpSession的setMaxInactiveInter(int seconds)來設置過期時間。之前cookie可以通過設置0來使的cookie無效,但是HttpSession將seconds設置爲0則使的session永遠不會過期。

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