Cookie 是伺服器發送給瀏覽器的小型純文字資料,瀏覽器會在後續請求中自動攜帶回傳。這使得網站能識別使用者身份、記住登入狀態、個性化首頁內容、投放精準廣告等。雖然常被誤解,但 Cookie 本身不會執行程式碼,不會帶來病毒風險,也佔用極少磁碟空間(每域名最多 20 個,每個 4KB,總計 300 個)。
Cookie userCookie = new Cookie("user", "uid1234");
建構子接受名稱與值,兩者均不得包含空白或特殊字元 [ ] ( ) = , " / ? @ : ;。
| 方法 | 用途 |
|---|---|
| setMaxAge(int seconds) | 設定存活秒數;負數為會話級(關閉瀏覽器即失效),正數為持久化。 |
| setDomain(String domain) | 指定適用域名,需以點開頭(如 .example.com)。 |
| setPath(String path) | 指定適用路徑,預設為當前頁面目錄。 |
| setSecure(boolean flag) | 僅允許 HTTPS 傳輸。 |
| setComment(String comment) | 設定備註說明。 |
| setVersion(int version) | 指定協定版本(0 為 Netscape 規範,1 為 RFC 2109)。 |
response.addCookie(userCookie);
此方法將 Cookie 寫入 HTTP 回應標頭 Set-Cookie。
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if ("user".equals(c.getName())) {
String value = c.getValue();
// 處理值
}
}
}
public static String getCookieValue(Cookie[] cookies, String name, String defaultValue) {
if (cookies != null) {
for (Cookie c : cookies) {
if (name.equals(c.getName())) return c.getValue();
}
}
return defaultValue;
}
public class LongLivedCookie extends Cookie {
public static final int SECONDS_PER_YEAR = 60 * 60 * 24 * 365;
public LongLivedCookie(String name, String value) {
super(name, value);
setMaxAge(SECONDS_PER_YEAR);
}
}
結合 SearchEnginesFrontEnd 與 CustomizedSearchEngines 兩個 Servlet,示範如何在表單中自動填入上次搜尋關鍵字、結果筆數與搜尋引擎選擇。
public class SearchEnginesFrontEnd extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
String searchString = ServletUtilities.getCookieValue(cookies, "searchString", "Java Programming");
String numResults = ServletUtilities.getCookieValue(cookies, "numResults", "10");
String searchEngine = ServletUtilities.getCookieValue(cookies, "searchEngine", "google");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
// 輸出 HTML 表單,value 屬性帶入上述變數
// 單選按鈕根據 searchEngine 設定 checked
}
}
public class CustomizedSearchEngines extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String searchString = request.getParameter("searchString");
response.addCookie(new LongLivedCookie("searchString", searchString));
String numResults = request.getParameter("numResults");
response.addCookie(new LongLivedCookie("numResults", numResults));
String searchEngine = request.getParameter("searchEngine");
response.addCookie(new LongLivedCookie("searchEngine", searchEngine));
// 根據搜尋引擎建構 URL 並重導向
SearchSpec[] specs = SearchSpec.getCommonSpecs();
for (SearchSpec spec : specs) {
if (spec.getName().equals(searchEngine)) {
response.sendRedirect(spec.makeURL(searchString, numResults));
return;
}
}
response.sendError(HttpServletResponse.SC_NOT_FOUND, "Unrecognized search engine");
}
}
setSecure(true) 確保僅在 HTTPS 傳輸。setMaxAge 避免永久追蹤。掌握 Cookie 機制,能為 Web 應用帶來更流暢、個性化的使用體驗。