From 8e25f10b2710bfb9d5f787df1cd533fe5fa62ac0 Mon Sep 17 00:00:00 2001 From: wangzhiwei Date: Tue, 7 Apr 2026 14:11:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(login):=20=E4=BC=98=E5=8C=96=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=99=BB=E5=87=BA=E5=8A=9F=E8=83=BD=E5=B9=B6=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 CacheManager 导入以支持缓存管理 - 从 Redis 中删除用户信息后增加从缓存中移除 token 映射逻辑 - 添加用户名和 token 的双向缓存清理机制 - 集成 Sa-Token 登出流程并完善异常处理 - 添加登出成功和异常的日志记录功能 - 优化注释描述提高代码可读性 --- .../skills/controller/LoginController.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/kexue/skills/controller/LoginController.java b/src/main/java/com/kexue/skills/controller/LoginController.java index 9b81a53..9e8af50 100644 --- a/src/main/java/com/kexue/skills/controller/LoginController.java +++ b/src/main/java/com/kexue/skills/controller/LoginController.java @@ -1,6 +1,7 @@ package com.kexue.skills.controller; import com.kexue.skills.annotation.PreventDuplicateSubmission; +import com.kexue.skills.common.CacheManager; import com.kexue.skills.common.CommonResult; import com.kexue.skills.entity.request.LoginDto; import com.kexue.skills.entity.request.LoginUserDto; @@ -13,6 +14,8 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.redisson.api.RedissonClient; +import static cn.dev33.satoken.SaManager.log; + /** * (SysUser)表控制层 * @@ -58,20 +61,27 @@ public class LoginController { @Operation(summary = "用户登出", description = "用户登出") public CommonResult logout() { try { - // 获取当前用户的token + // 获取当前用户的 token String token = cn.dev33.satoken.stp.StpUtil.getTokenValue(); - - // 使用Sa-Token登出 - cn.dev33.satoken.stp.StpUtil.logout(); - - // 从Redis中删除用户信息 + + // 从 Redis 中删除用户信息 if (token != null && !token.isEmpty()) { redissonClient.getBucket("loginUser:" + token).delete(); + // 从缓存中移除 token 映射 + String username = CacheManager.getUsernameFromToken(token); + if (username != null) { + CacheManager.removeTokenFromCache(username); + } } - + + // 使用 Sa-Token 登出(这会清除 Sa-Token 内部的会话信息) + cn.dev33.satoken.stp.StpUtil.logout(); + + log.info("用户登出成功,token 已清理"); return CommonResult.success("登出成功"); } catch (Exception e) { - // 如果获取token失败,仍然执行登出操作 + log.error("登出异常:{}", e.getMessage()); + // 如果获取 token 失败,仍然执行登出操作 cn.dev33.satoken.stp.StpUtil.logout(); return CommonResult.success("登出成功"); }