HTTP 協議無狀態,Web 應用需通過 Cookie、Session、URL 重寫 實現會話狀態持久化。本文系統講解三大機制原理、Servlet API 使用、代碼實例、安全考量與選型指南,針對 Oracle Web 開發者(OC4J/WebLogic/GlassFish 通用)。
Set-Cookie: NAME=VALUE; Expires=DATE; Path=PATH; Domain=DOMAIN; SecureSet-Cookie: NAME=VALUE; Comment=...; Domain=...; Max-Age=SECONDS; Path=...; Secure; Version=1HttpOnly、SameSite 屬性增強安全。// 創建
Cookie c = new Cookie("userId", "12345");
c.setMaxAge(3600); // 秒,負數=會話級,0=刪除
c.setPath("/app"); // 作用路徑
c.setDomain(".company.com");// 跨子域
c.setSecure(true); // 僅 HTTPS
c.setHttpOnly(true); // 防 XSS 竊取
c.setComment("User session");
// 寫入響應
response.addCookie(c);
// 讀取請求
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie ck : cookies) {
if ("userId".equals(ck.getName())) { ... }
}
}
// LoginServlet.doPost
String u = request.getParameter("username");
String p = request.getParameter("password");
if (auth(u,p)) {
Cookie c = new Cookie("loginToken", generateToken(u));
c.setMaxAge(7*24*3600); // 7 天
c.setPath("/");
response.addCookie(c);
response.sendRedirect("welcome.jsp");
}
// WelcomeServlet.doGet
Cookie[] cs = request.getCookies();
String token = Arrays.stream(cs).filter(c->"loginToken".equals(c.getName())).findFirst().map(Cookie::getValue).orElse(null);
if (token != null && validateToken(token)) {
out.println("Welcome back, " + getUserFromToken(token));
} else {
response.sendRedirect("login.jsp");
}
SameSite=Strict/Lax + 雙重提交 Cookie)。HttpSession 對象,內存/數據庫/Redis 存儲屬性映射。JSESSIONID Cookie 或 URL 重寫在客戶端與服務端傳遞。web.xml <session-timeout> 或 session.setMaxInactiveInterval())。HttpSession session = request.getSession(true); // 獲取或創建
session.setAttribute("user", userObj); // 存放對象
User u = (User) session.getAttribute("user"); // 取出
session.removeAttribute("cart"); // 移除
session.invalidate(); // 強制銷毀(登出)
| 維度 | Cookie | Session |
|---|---|---|
| 存儲位置 | 客戶端(瀏覽器內存/硬盤) | 服務端(內存/DB/Redis) |
| 容量 | 4KB/條 | 受限於服務端內存/存儲 |
| 安全性 | 可被竊取/篡改 | 相對安全(ID 難猜測) |
| 生命週期 | 可持久化(Max-Age) | 會話級/配置超時 |
| 跨瀏覽器共享 | 同域名下共享 | 不同瀏覽器 = 不同 Session |
| 集群擴展 | 天然無狀態 | 需 Session Replication / Sticky Session / 外部存儲 |