| 屬性 | 作用 | 典型登錄 Cookie 設置 |
| Domain | 生效域範圍 | .example.com(含子域)或 example.com(僅當前域) |
| Path | 生效路徑前綴 | /(全站生效) |
| Expires/Max-Age | 過期時間 | 會話級(瀏覽器關閉失效)或持久化(如 30 天) |
| Secure | 僅 HTTPS 傳輸 | 必須 true(生產環境全站 HTTPS) |
| HttpOnly | 禁止 JS 讀取(防 XSS) | 必須 true |
| SameSite | 跨站請求攜帶策略 | Lax(默認,鏈接跳轉帶上)或 Strict(僅同站) |
Java Servlet 代碼示例
登錄寫入
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
// 驗證用戶名密碼...
String sessionId = UUID.randomUUID().toString();
// 存入 Redis: sessionId -> userId
Cookie cookie = new Cookie("SESSIONID", sessionId);
cookie.setDomain(".example.com"); // 支援子域
cookie.setPath("/"); // 全站
cookie.setHttpOnly(true); // 防 XSS
cookie.setSecure(true); // 僅 HTTPS
cookie.setMaxAge(30 * 24 * 3600); // 30 天
// cookie.setAttribute("SameSite", "Lax"); // Servlet 4.0+ (Tomcat 9+, Jetty 9.4+)
resp.addCookie(cookie);
resp.sendRedirect("https://profile.example.com");
}
}
個人中心讀取
@WebServlet("/profile")
public class ProfileServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
Cookie[] cookies = req.getCookies(); // 容器自動解析請求頭 Cookie
String sessionId = null;
if (cookies != null) {
for (Cookie c : cookies) {
if ("SESSIONID".equals(c.getName())) {
sessionId = c.getValue();
break;
}
}
}
// 從 Redis 獲取 userId -> 查用戶信息 -> 渲染頁面
}
}
常見坑點排查
- 域不匹配:登錄寫
www.example.com,個人中心在 app.example.com → 需寫 .example.com。
- Path 過窄:登錄寫
/login,個人中心在 /profile → 需寫 /。
- Secure 不一致:登錄頁 HTTPS,個人中心誤用 HTTP → Cookie 不發送。
- SameSite=Strict:從外部鏈接跳轉個人中心 → Cookie 不發送 → 改
Lax。
- 第三方 Cookie 被瀏覽器阻擋:登錄域與業務域不同主域(如
auth.com vs app.com)→ 現代瀏覽器默認阻擋 → 需改為同主域或用 OAuth2/OIDC 授權碼流。
總結
**瀏覽器是 Cookie 的自動攜帶者**。只要登錄時正確設置 Domain/Path/Secure/HttpOnly/SameSite,後續同域請求**無需任何前端代碼干預**,服務端即可從請求頭透明獲取。這是 HTTP 無狀態協議下維持會話的基石機制。
- 上一篇文章: Oracle 查詢表創建時間與創建者:USER_OBJECTS 視圖一條 SQL 搞定
- 下一篇文章: HTML 動態生成可交互扇形統計圖:ECharts / Chart.js / HighCharts 選型指南
Copyright ©
程式碼之家 All Rights Reserved