Servlet 筆記-Session 跟蹤
HTTP 是一種"無狀態"協議,這意味著每次客戶端檢索網頁時,客戶端打開一個單獨的連接到 Web 服務器,服務器會自動不保留之前客戶端請求的任何記錄。
但是仍然有以下三種方式來維持 Web 客戶端和 Web 服務器之間的 session 會話:
Cookies
一個 Web 服務器可以分配一個唯一的 session 會話 ID 作為每個 Web 客戶端的 cookie,對於客戶端的後續請求可以使用接收到的 cookie 來識別。
這可能不是一個有效的方法,因為很多瀏覽器不支持 cookie,所以我們建議不要使用這種方式來維持 session 會話。
隱藏的表單字段
一個 Web 服務器可以發送一個隱藏的 HTML 表單字段,以及一個唯一的 session 會話 ID
當表單被提交時,指定的名稱和值會被自動包含在 GET 或 POST 數據中。每次當 Web 瀏覽器發送回請求時,session_id 值可以用於保持不同的 Web 瀏覽器的跟蹤。
這可能是一種保持 session 會話跟蹤的有效方式,但是點擊常規的超文本鏈接(<A HREF...>)不會導致表單提交,因此隱藏的表單字段也不支持常規的 session 會話跟蹤。
URL 重寫
您可以在每個 URL 末尾追加一些額外的數據來標識 session 會話,服務器會把該 session 會話標識符與已存儲的有關 session 會話的數據相關聯。
URL 重寫是一種更好的維持 session 會話的方式,它在瀏覽器不支持 cookie 時能夠很好地工作,但是它的缺點是會動態生成每個 URL 來為頁面分配一個 session 會話 ID,即使是在很簡單的靜態 HTML 頁面中也會如此。
HttpSession 對象
Servlet 還提供了 HttpSession 接口,該接口提供了一種跨多個頁面請求或訪問網站時識別用戶以及存儲有關用戶信息的方式。
Servlet 容器使用這個接口來創建一個 HTTP 客戶端和 HTTP 服務器之間的 session 會話。會話持續一個指定的時間段,跨多個連接或頁面請求。
通過調用 HttpServletRequest 的公共方法 getSession() 來獲取 HttpSession 對象
刪除 Session 會話數據
當完成了一個用戶的 session 會話數據,有以下幾種選擇:
- 移除一個特定的屬性:可以調用 public void removeAttribute(String name)
- 刪除整個 session 會話:可以調用 public void invalidate() 方法來丟棄整個 session 會話。
- 設置 session 會話過期時間:可以調用 public void setMaxInactiveInterval(int interval) 方法來單獨設置 session 會話超時。
- 註銷用戶:如果使用的是支持 servlet 2.4 的服務器,您可以調用 logout 來註銷 Web 服務器的客戶端,並把屬於所有用戶的所有 session 會話設置為無效。
- web.xml 配置:如果使用的是 Tomcat,除了上述方法,還可以在 web.xml 文件中配置 session 會話超時。
Servlet 筆記-Session 跟蹤