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

Cookie 自動登錄原理實戰:以博客園為例實現「記住我」功能

     編輯:Java 綜合教學

Cookie 自動登錄原理實戰:以博客園為例實現「記住我」功能

本文通過分析博客園登錄流程,揭示 Cookie 自動登錄本質,並提供基於 Struts2 + Servlet Filter 的完整 Demo 實現。

Cookie 基礎

Cookie 是瀏覽器自動攜帶的鍵值對,屬於特定域名/路徑。伺服器通過 Set-Cookie 响應頭下發,瀏覽器後續請求自動附帶 Cookie 請求頭。關鍵屬性:Domain、Path、Expires/Max-Age、HttpOnly、Secure、SameSite。

博客園登錄分析

  1. 未登錄時:僅有會話級 Cookie(SERVERID 等),關閉瀏覽器即失效。
  2. 登錄(未勾選自動登錄):响應頭新增 .CNBlogsCookie,Max-Age=-1(會話級),關閉瀏覽器失效。
  3. 登錄(勾選自動登錄):.CNBlogsCookie 設置 Max-Age=2592000(30 天),持久化到硬盤,下次訪問自動攜帶,伺服器驗證通過即自動登錄。
  4. 安全結論:Cookie 中不直接存明文密碼,而是存儲加密 Token 或與用戶綁定的隨機字符串(如 UUID),伺服器端驗證映射關係。

Demo 架構

  • 前端:loginUI.jsp(jQuery 讀取 Cookie 預填用戶名)、successUI.jsp
  • 控制器:Struts2 LoginAction 處理表單登錄、生成 Token、下發 Cookie
  • 攔截器:LoginFilter 攔截受保護資源,優先驗證 Session,失效則嘗試 Cookie 自動登錄
  • 工具類:CookieUtil 解析 Cookie、驗證 Token、重建 Session
  • 持久層:DbUtils + C3P0 連接池,UserDao 操作 user 表(含 hobby 字段存儲 UUID Token)

核心代碼片段

表單登錄生成 Token

// 登錄成功後
String uuid = UUID.randomUUID().toString().replace("-", "");
user.setHobby(uuid); // 存入資料庫
userDao.updateUser(user);

String token = URLEncoder.encode(user.getUsername() + "," + uuid, "UTF-8");
Cookie cookie = new Cookie("loginInfo", token);
cookie.setMaxAge(60 * 60); // 1 小時演示
cookie.setPath("/");
response.addCookie(cookie);

Filter 自動登錄邏輯

public boolean loginByCookies(HttpServletRequest req, HttpServletResponse resp) {
    Cookie[] cookies = req.getCookies();
    if (cookies != null) {
        for (Cookie c : cookies) {
            if ("loginInfo".equals(c.getName())) {
                String val = URLDecoder.decode(c.getValue(), "UTF-8");
                String[] parts = val.split(",");
                User user = userDao.findByUsernameAndHobby(parts[0], parts[1]);
                if (user != null) {
                    req.getSession().setAttribute("loginUser", user);
                    return true;
                }
            }
        }
    }
    return false;
}

web.xml 過濾器順序

<filter>
  <filter-name>loginFilter</filter-name>
  <filter-class>top.bwcx.cookie.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>loginFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Struts2 filter 放在後面 -->

關鍵點總結

  • Cookie 不存密碼,存隨機 Token,資料庫映射驗證。
  • setMaxAge > 0 持久化,< 0 會話級,= 0 刪除。
  • Filter 鏈順序:自定義登錄過濾器 → Struts2 過濾器。
  • 生產環境需加強:HTTPS、HttpOnly、Secure、SameSite=Strict、Token 定期輪換、防 CSRF。

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