Java Servlet API 中引用 Session 機制來追蹤客戶的狀態。Servlet API 中定義了 javax.servlet.http.HttpSession 接口,Servlet 容器必須實現這個接口。當一個 Session 開始時,Servlet 容器將創建一個 HttpSession 對象,Servlet 容器為 HttpSession 分配一個唯一標識符,稱為 Session ID。Servlet 容器將 Session ID 作為 Cookie 保存在客戶的瀏覽器中。每次客戶發出 HTTP 請求時,Servlet 容器可以從 HttpRequest 對象中讀取 Session ID,然后根據 Session ID 找到相應的 HttpSession 對象,從而獲取客戶的狀態信息。
當客戶端瀏覽器中禁止 Cookie,Servlet 容器無法從客戶端瀏覽器中取得作為 Cookie 的 Session ID,也就無法跟蹤客戶狀態。
Java Servlet API 中提出了跟蹤 Session 的另一種機制,如果客戶端瀏覽器不支持 Cookie,Servlet 容器可以重寫客戶請求的 URL,把 Session ID 添加到 URL 信息中。
HttpServletResponse 接口提供了重寫 URL 的方法:public java.lang.String encodeURL(java.lang.String url)
該方法的實現機制為:
● 先判斷當前的 Web 組件是否啟用 Session,如果沒有啟用 Session,直接返回參數 url。
● 再判斷客戶端瀏覽器是否支持 Cookie,如果支持 Cookie,直接返回參數 url;如果不支持 Cookie,就在參數 url 中加入 Session ID 信息,然后返回修改后的 url。
我們可以對網頁中的鏈接稍作修改,解決以上問題:
修改前:
<a href=“maillogin.jsp“>
修改后:
<a href=“<%=response.encodeURL(“maillogin.jsp“)%>“>
HTTP協議本身是無狀態的,這與HTTP協議本來的目的是相符的,客戶端只需要簡單的向服務器請求下載某些文件,無論是客戶端還是服務器都沒有必要紀錄 彼此過去的行為,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關系一樣。
用response.sendRedirect(response.encodeURL(ABC))的好處就是他能將用戶的session追加到網址的末尾,也就是能夠保證用戶在不同的頁面時的session對象是一致的.
這樣做的目的是防止某些瀏覽器不支持或禁用了COOKIE導致session跟蹤失敗