| 方法 | 說明 |
new Cookie(name, value) | 創建,名值必須符合 HTTP Token 規範 |
setMaxAge(int seconds) | 生存秒數;< 0 = 會話級;0 = 立即刪除 |
setDomain(String) | 可見域(如 .example.com 含子域) |
setPath(String) | 可見路徑前綴(如 /app) |
setSecure(boolean) | 僅 HTTPS 發送 |
setHttpOnly(boolean) | JS 不可讀(防 XSS),Servlet 3.0+ |
getName()/getValue() | 讀取 |
寫入 Cookie:回應端
Cookie cookie = new Cookie("userId", "12345");
cookie.setMaxAge(3600); // 1 小時
cookie.setPath("/myapp"); // 僅 /myapp 路徑可見
cookie.setHttpOnly(true); // 安全加固
response.addCookie(cookie); // 寫入 Set-Cookie 頭
讀取 Cookie:請求端
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if ("userId".equals(c.getName())) {
String userId = c.getValue();
// 業務邏輯
break;
}
}
}
完整實戰:ShowCookies Servlet
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class ShowCookies extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
Cookie[] cookies = req.getCookies();
out.println("Cookie 信息");
if (cookies == null || cookies.length == 0) {
out.println("無 Cookie
");
} else {
out.println("請求攜帶的 Cookies
");
out.println("| Name | Value | Comment | MaxAge |
");
for (Cookie c : cookies) {
out.printf("| %s | %s | %s | %d |
",
c.getName(), c.getValue(), c.getComment(), c.getMaxAge());
}
out.println("
");
}
out.println("");
}
}
安全考量
- 敏感數據禁用 Cookie:Session ID、Token 應用
HttpOnly + Secure
- 防 CSRF:關鍵操作驗證
SameSite (Servlet 5.0+/Cookie 設定) 或雙重提交 Token
- 防 XSS:輸出 Cookie 值時 HTML 轉義
- 大小限制:單 Cookie ≤ 4KB,單域 ≤ 20-50 個,超限會被瀏覽器丟棄
最佳實踐清單
- 命名規範:前綴業務域(如
app_userId)
- 最小權限:
Path 限制最窄路徑,Domain 僅必要時跨子域
- 加密敏感值:AES-GCM 加密後存儲,服務端解密
- 定期輪換:登入態 Cookie 設定較短
MaxAge,配合 Refresh Token
- 上一篇文章: 利用 Observer 設計模式實現組件間鬆耦合通信
- 下一篇文章: Java 多線程實戰精要:線程優先級的局限與正確併發控制策略
Copyright ©
程式碼之家 All Rights Reserved