業務流程
- 用戶訪問受保護頁面。
- 檢查 Session:若存在
user 屬性 → 直接放行。
- 檢查 Cookie:若無 Session,讀取 Cookie
autoLoginToken。
- Token 有效(數據庫校驗通過) → 重建 Session,放行。
- Token 無效/過期 → 刪除 Cookie,跳轉登錄頁。
- 無 Session 且無 Cookie → 直接跳轉登錄頁。
關鍵實現點
- 登錄成功時:若用戶勾選「記住我」,生成隨機 Token,存入數據庫(關聯 user_id、過期時間),寫入 Cookie:
Cookie cookie = new Cookie("autoLoginToken", token); cookie.setMaxAge(3*24*3600); // 3天 cookie.setPath("/"); response.addCookie(cookie);
- 攔截器/過濾器:統一在
Filter 中實現上述邏輯,避免各 Servlet 重復代碼。
- 安全性:Token 應為加密隨機串,防暴力猜解;數據庫存儲哈希值;HTTPS 傳輸。
代碼結構建議
@WebFilter("/*")
public class AutoLoginFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession(false);
if (session != null && session.getAttribute("user") != null) {
chain.doFilter(req, resp); return;
}
// 檢查 Cookie...
chain.doFilter(req, resp);
}
}