會話跟蹤技術
會話跟蹤技術是一種在 Web 應用程序中跟蹤用戶會話狀態的機制,它允許服務器在多個請求之間識別和關聯屬于同一用戶的請求,以便在整個會話過程中保持用戶相關的信息。
以下是幾種常見的會話跟蹤技術:
Cookie
- 概念:Cookie 是服務器發送到用戶瀏覽器并保存在本地的一小段數據,以鍵值對形式存儲。瀏覽器后續向同一服務器發起請求時,會自動在請求頭中攜帶這些 Cookie 數據。
- 原理:用戶訪問服務器時,服務器在響應頭中通過
Set-Cookie
字段向瀏覽器發送 Cookie。瀏覽器接收后將其存儲在本地。之后瀏覽器每次向該服務器發送請求時,會在請求頭的Cookie
字段中帶上這些 Cookie 信息,服務器據此識別用戶狀態。- 應用場景:用于記錄用戶偏好、實現自動登錄、跟蹤用戶行為等。
Session
- 概念:Session 是服務器端用于跟蹤用戶會話的機制。服務器為每個用戶創建一個唯一的 Session 對象,用于存儲該用戶在整個會話期間的相關數據。
- 原理:用戶首次訪問服務器時,服務器為其創建一個唯一的 Session ID,并通過響應頭中的
Set-Cookie
將該 ID 發送給瀏覽器,瀏覽器將其存儲在本地的 Cookie 中。后續請求時,瀏覽器會在請求頭的Cookie
字段中帶上這個 Session ID,服務器根據該 ID 查找對應的 Session 對象,獲取和更新用戶相關數據。- 應用場景:常用于用戶認證與授權、購物車功能、多頁面表單數據傳遞等場景。
URL 重寫
- 概念:通過在 URL 中附加會話相關的信息,如 Session ID,來跟蹤用戶會話。當用戶訪問一個頁面時,服務器將包含 Session ID 的新 URL 返回給瀏覽器,瀏覽器在后續請求中使用這個帶有 Session ID 的 URL,服務器就可以根據 URL 中的 Session ID 來識別用戶會話。
- 原理:服務器在生成頁面的鏈接時,將 Session ID 作為參數附加到 URL 后面。用戶點擊鏈接時,瀏覽器將包含 Session ID 的 URL 發送給服務器,服務器從 URL 中解析出 Session ID,從而確定用戶的會話。
- 應用場景:當瀏覽器禁用了 Cookie 時,可以作為替代方案來實現會話跟蹤。不過,由于 URL 中攜帶了會話信息,可能會存在一定的安全風險,且在某些情況下可能會導致 URL 過長。
隱藏表單域
- 概念:在 HTML 表單中添加一個隱藏的輸入字段,用于存儲會話相關的信息,如 Session ID。當表單提交時,這個隱藏字段的值也會被發送到服務器,服務器可以根據這個值來跟蹤用戶會話。
- 原理:服務器在生成 HTML 頁面時,在表單中插入一個隱藏的輸入字段,并將 Session ID 等會話信息作為該字段的值。用戶提交表單時,瀏覽器將表單數據包括隱藏字段的值一起發送給服務器,服務器從接收到的表單數據中獲取隱藏字段的值,從而識別用戶會話。
- 應用場景:同樣可以在 Cookie 被禁用的情況下作為一種補充的會話跟蹤方式,但它只能在表單提交時傳遞會話信息,對于其他類型的請求(如直接訪問頁面)則無法使用。
一、Cookie
?1.概念介紹
Cookie 是服務器發送到用戶瀏覽器并保存在本地的小段數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶上并發送到服務器上。這些數據可以幫助服務器識別用戶身份、記錄用戶偏好等。
2.基本使用方法
設置 Cookie
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;@WebServlet("/setCookie") public class SetCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 創建一個 Cookie 對象,鍵為 username,值為 JohnCookie cookie = new Cookie("username", "John");// 設置 Cookie 的有效期為 3600 秒(1 小時)cookie.setMaxAge(3600);// 將 Cookie 添加到響應中resp.addCookie(cookie);resp.getWriter().println("Cookie has been set.");} }
獲取 Cookie
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;@WebServlet("/getCookie") public class GetCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取請求中的所有 CookieCookie[] cookies = req.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {if ("username".equals(cookie.getName())) {resp.getWriter().println("Username from cookie: " + cookie.getValue());return;}}}resp.getWriter().println("No username cookie found.");} }
發送請求后控制臺輸出?
3.原理
當客戶端(瀏覽器)向服務器發送請求時,服務器可以在響應頭中添加?
Set - Cookie
?字段,瀏覽器接收到響應后會將這些 Cookie 存儲在本地。之后,瀏覽器每次向該服務器發送請求時,都會在請求頭中包含?Cookie
?字段,將之前存儲的 Cookie 信息發送給服務器,服務器根據這些信息進行相應處理。4.使用細節
- 有效期:可以通過?
setMaxAge()
?方法設置 Cookie 的有效期。正數表示多少秒后過期,負數表示瀏覽器關閉時過期,0 表示立即刪除。- 作用域:可以通過?
setPath
?和?setDomain
?方法設置 Cookie 的作用路徑和作用域名,只有在指定路徑和域名下的請求才會攜帶該 Cookie。- 安全性:可以通過?
setSecure
?方法設置 Cookie 只能通過 HTTPS 協議傳輸,通過?setHttpOnly
?方法設置 Cookie 不能被 JavaScript 腳本訪問,防止 XSS 攻擊。- 存儲中文:URL編碼
5.應用場景
- 記錄用戶偏好:如網站的主題顏色、字體大小等設置。
- 實現自動登錄:存儲用戶的登錄憑證,下次訪問時自動登錄。
- 跟蹤用戶行為:記錄用戶瀏覽過的頁面等信息,用于分析用戶行為。
二、Session?
1.概念介紹
Session 是服務器端的會話機制,服務器會為每個客戶端(瀏覽器)創建一個唯一的 Session 對象,用于存儲該客戶端在整個會話期間的相關數據。客戶端通過一個唯一的 Session ID 來與服務器的 Session 對象進行關聯。
2.基本使用方法
創建并使用 Session
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException;@WebServlet("/createSession") public class CreateSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取當前請求的 Session,如果不存在則創建一個新的HttpSession session = req.getSession(true);// 向 Session 中存儲一個屬性session.setAttribute("userRole", "admin");resp.getWriter().println("Session has been created and attribute set.");} }
獲取 Session 中的數據
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException;@WebServlet("/getSession") public class GetSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取當前請求的 Session,如果不存在則返回 nullHttpSession session = req.getSession(false);if (session != null) {// 從 Session 中獲取屬性String userRole = (String) session.getAttribute("userRole");if (userRole != null) {resp.getWriter().println("User role from session: " + userRole);} else {resp.getWriter().println("No user role attribute found in session.");}} else {resp.getWriter().println("No session found.");}} }
3.原理
當客戶端第一次訪問服務器時,服務器會創建一個新的 Session 對象,并為其生成一個唯一的 Session ID。服務器會將這個 Session ID 通過?
Set - Cookie
?響應頭發送給客戶端,客戶端將其存儲在本地的 Cookie 中。之后客戶端每次請求時,都會將這個 Session ID 包含在請求頭的?Cookie
?字段中發送給服務器,服務器根據這個 Session ID 找到對應的 Session 對象,從而獲取和更新會話數據。4.使用細節
- 活化、鈍化:在服務器正常關閉后,Tomcat會自動將Session數據寫入硬盤的文件中(鈍化),再次啟動服務器后,從文件中加載數據到Session中(活化)。二者保證了服務器重啟前后,數據的持久化。應用場景:購物車信息持久留存。
- 存儲位置:Session 數據默認存儲在服務器的內存中,但也可以配置存儲在數據庫或文件系統中,以支持分布式環境。
- 過期時間:可以通過?
setMaxInactiveInterval
?方法設置 Session 的最大不活動時間,超過這個時間 Session 會自動失效。或者設置如下圖依賴。- 銷毀:可以通過?
invalidate
?方法手動銷毀 Session。該方法可應用于用戶退出登錄
5.應用場景
- 用戶認證與授權:存儲用戶的登錄狀態和權限信息,在用戶訪問受保護資源時進行驗證。
- 購物車功能:將用戶添加到購物車的商品信息存儲在 Session 中,方便用戶在購物過程中操作。
- 多頁面表單數據傳遞:在用戶填寫多個頁面的表單時,將中間數據存儲在 Session 中,最后一起處理。
三、Cookie 和 Session 的區別
存儲位置
- Cookie:數據存儲在客戶端(瀏覽器)。
- Session:數據存儲在服務器端。
安全性
- Cookie:由于存儲在客戶端,容易被篡改或竊取,安全性較低。但可以通過設置安全屬性(如?
secure
?和?HttpOnly
)提高安全性。- Session:數據存儲在服務器端,相對安全。但如果 Session ID 泄露,可能會被攻擊者利用。
存儲容量
- Cookie:單個 Cookie 通常限制在 4KB 左右,每個域名下的 Cookie 數量也有限制。
- Session:存儲容量主要取決于服務器的配置,理論上可以存儲更多的數據。
生命周期
- Cookie:可以通過設置?
setMaxAge
?方法控制有效期,分為會話期 Cookie(瀏覽器關閉時失效)和持久化 Cookie(指定過期時間)。- Session:可以通過?
setMaxInactiveInterval
?方法設置最大不活動時間,超過時間自動失效,也可以手動銷毀。應用場景側重點
- Cookie:更適合存儲一些不太敏感的用戶偏好信息,方便在不同頁面之間共享。
- Session:主要用于存儲用戶的會話狀態和敏感信息,如登錄狀態、權限等。