首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

Servlet Cookie 處理完整指南:建立、讀取與實戰應用

     編輯:關於JSP

Cookie 概述

Cookie 是伺服器發送給瀏覽器的小型純文字資料,瀏覽器會在後續請求中自動攜帶回傳。這使得網站能識別使用者身份、記住登入狀態、個性化首頁內容、投放精準廣告等。雖然常被誤解,但 Cookie 本身不會執行程式碼,不會帶來病毒風險,也佔用極少磁碟空間(每域名最多 20 個,每個 4KB,總計 300 個)。

Servlet Cookie API 核心操作

建立 Cookie

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)。

發送 Cookie 至客戶端

response.addCookie(userCookie);

此方法將 Cookie 寫入 HTTP 回應標頭 Set-Cookie。

從請求讀取 Cookie

Cookie[] cookies = request.getCookies();
if (cookies != null) {
  for (Cookie c : cookies) {
    if ("user".equals(c.getName())) {
      String value = c.getValue();
      // 處理值
    }
  }
}

實用工具類

取得指定 Cookie 值

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;
}

長效 Cookie 包裝類

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,示範如何在表單中自動填入上次搜尋關鍵字、結果筆數與搜尋引擎選擇。

前端 Servlet:讀取 Cookie 填充表單

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
  }
}

後端 Servlet:接收參數並寫入 Cookie

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");
  }
}

最佳實踐提醒

  • 敏感資訊(密碼、信用卡號)絕不可存放在 Cookie 中。
  • 善用 setSecure(true) 確保僅在 HTTPS 傳輸。
  • 設定合理的 setMaxAge 避免永久追蹤。
  • 提供「記住我」選項讓使用者自主決定。

掌握 Cookie 機制,能為 Web 應用帶來更流暢、個性化的使用體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved