Cookie 是 HTTP 無狀態協議下識別用戶的經典方案。雖然現代 Web 有 localStorage、SessionStorage、JWT 等新選擇,但 Cookie 仍是跨域單點登入、記住登入、追蹤分析的基石。本文以 JSP 為例,系統講解 Cookie 全生命週期操作。
<%
String cookieName = "Sender";
Cookie cookie = new Cookie(cookieName, "Test_Content");
cookie.setMaxAge(10); // 10 秒過期
// cookie.setMaxAge(365*24*60*60); // 一年過期
response.addCookie(cookie);
%>
new Cookie(name, value),名稱值皆為 String,值不可含空格、分號、逗號、等號、括號、@ 等特殊字符(Version 0 規範)。.example.com)。<%
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
String name = c.getName();
String value = c.getValue();
out.println("Name: " + name + ", Value: " + value + "<br/>");
}
}
%>
request.getCookies() 返回當前路徑及父路徑所有有效 Cookie 數組,無則返回 null。javax.servlet.http.Cookie 僅支援此版本。Cookie 值僅支援 ASCII 可打印字符(Version 0)。中文、特殊符號必須編碼:
// 寫入
String encoded = URLEncoder.encode("中文值", "UTF-8");
Cookie c = new Cookie("key", encoded);
// 讀取
String decoded = URLDecoder.decode(c.getValue(), "UTF-8");
path=/ 造成互相污染。cookie.setSecure(true); // 僅 HTTPS
cookie.setHttpOnly(true); // 防 XSS 竊取
// cookie.setSameSite("Strict"); // Servlet 5.0+ (Jakarta EE 9+) 支援 SameSite
<%@ page import="java.net.URLEncoder, java.net.URLDecoder" %>
<%
// 寫入
String username = request.getParameter("username");
if (username != null) {
Cookie c = new Cookie("remember_user", URLEncoder.encode(username, "UTF-8"));
c.setMaxAge(30*24*60*60); // 30 天
c.setPath(request.getContextPath());
c.setHttpOnly(true);
response.addCookie(c);
}
// 讀取回顯
String saved = "";
Cookie[] cs = request.getCookies();
if (cs != null) {
for (Cookie c : cs) {
if ("remember_user".equals(c.getName())) {
saved = URLDecoder.decode(c.getValue(), "UTF-8");
break;
}
}
}
%>
<input type="text" name="username" value="<%=saved%>" />
response.addCookie,讀取靠 request.getCookies。setMaxAge 決定,0 刪除,負數會話級。