核心思路
- 登錄成功:生成隨機 Token,關聯用戶 ID 存入 Redis(設置過期時間,如 30 天),將 Token 寫入 HttpOnly Cookie (
remember_me=token; Max-Age=2592000; Path=/; HttpOnly; Secure)。
- 攔截器預處理:
preHandle 中檢查 Session 無用戶且 Cookie 存在 Token → 從 Redis 獲取 UserId → 查詢用戶信息存入 Session → 續期 Token/Redis。
- 登出/修改密碼:刪除 Redis Token、清除 Cookie。
關鍵代碼
// 登錄
String token = UUID.randomUUID().toString().replace("-", "");
redisTemplate.opsForValue().set("remember:" + token, userId, 30, TimeUnit.DAYS);
Cookie cookie = new Cookie("remember_me", token);
cookie.setMaxAge(30*24*3600); cookie.setPath("/"); cookie.setHttpOnly(true);
response.addCookie(cookie);
// 攔截器
String token = WebUtils.getCookie(request, "remember_me");
if (token != null && session.getAttribute("user") == null) {
String userId = redisTemplate.opsForValue().get("remember:" + token);
if (userId != null) {
User user = userService.getById(userId);
session.setAttribute("user", user);
redisTemplate.expire("remember:" + token, 30, TimeUnit.DAYS); // 滑動過期
}
}
參考
SpringMVC記住密碼功能完整實現