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

Cookie 機制詳解:為什麼個人中心頁面能自動讀取登錄 Cookie?

     編輯:程式設計綜合問答

核心機制:瀏覽器自動攜帶同域 Cookie

當你在登錄頁 login.example.com 寫入 Cookie 後:

  1. 瀏覽器將 Cookie 存儲在本地(內存/硬盤),關聯域 example.com、路徑 /、安全屬性(Secure、HttpOnly、SameSite)。
  2. 用戶跳轉到 profile.example.com(個人中心)時,**瀏覽器自動檢查 Cookie 池**:凡符合 域匹配、路徑匹配、未過期、Secure/HTTPS 一致、SameSite 策略允許 的 Cookie,**自動放入 HTTP 請求頭 Cookie: name=value; ... 發送給服務器**。
  3. 服務端(Java/Servlet/Node/PHP/Go...)從請求頭解析 Cookie,識別用戶會話,**無需前端顯式傳參**。

關鍵屬性決定「能否自動帶上」

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 無狀態協議下維持會話的基石機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
屬性作用典型登錄 Cookie 設置
Domain生效域範圍.example.com(含子域)或 example.com(僅當前域)
Path生效路徑前綴/(全站生效)
Expires/Max-Age過期時間會話級(瀏覽器關閉失效)或持久化(如 30 天)
Secure僅 HTTPS 傳輸必須 true(生產環境全站 HTTPS)
HttpOnly禁止 JS 讀取(防 XSS)必須 true
SameSite跨站請求攜帶策略Lax(默認,鏈接跳轉帶上)或 Strict(僅同站)