From 568c6a6a74c0d625ca97eb0a4671b246bf04a71b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=B8=E7=86=9F=E5=90=B4=E5=BD=A6=E7=A5=96?= Date: Fri, 27 Feb 2026 14:04:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(login):=20=E8=A7=A3=E5=86=B3=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E9=87=8D=E5=A4=8D=E7=99=BB=E5=BD=95=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加了SysUserTokenEntity实体类导入 - 实现了前端token与数据库token的一致性验证 - 增加了对请求头中token的检查逻辑 - 添加了多地登录场景的判断和处理 - 实现了自动清理旧token并允许重新登录的功能 - 优化了重复登录错误提示的触发条件 --- .../sys/controller/SysLoginController.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gaotao/modules/sys/controller/SysLoginController.java b/src/main/java/com/gaotao/modules/sys/controller/SysLoginController.java index b9d0d70..d6a0e3d 100644 --- a/src/main/java/com/gaotao/modules/sys/controller/SysLoginController.java +++ b/src/main/java/com/gaotao/modules/sys/controller/SysLoginController.java @@ -6,6 +6,7 @@ import com.gaotao.common.constant.SysMsgConstant; import com.gaotao.common.utils.Constant; import com.gaotao.common.utils.R; import com.gaotao.modules.sys.entity.SysUserEntity; +import com.gaotao.modules.sys.entity.SysUserTokenEntity; import com.gaotao.modules.sys.form.SysLoginForm; import com.gaotao.modules.sys.service.SysCaptchaService; import com.gaotao.modules.sys.service.SysUserService; @@ -113,7 +114,23 @@ public class SysLoginController extends AbstractController { } // 检查用户是否已登录(超级管理员跳过检查)- rqrq if(user.getUserId() != Constant.SUPER_ADMIN && sysUserTokenService.isUserLoggedIn(user.getUserId())){ - return R.error("用户已经登录,请先退出后再登录"); + // 检查请求中是否携带token - rqrq + String oldToken = request.getHeader("token"); + + if(oldToken != null && !oldToken.isEmpty()) { + // 验证前端token是否与数据库中的token一致 - rqrq + SysUserTokenEntity tokenEntity = sysUserTokenService.getById(user.getUserId()); + if(tokenEntity != null && tokenEntity.getToken().equals(oldToken)) { + // Token一致,说明是真的多地登录 - rqrq + return R.error("用户已经登录,请先退出后再登录"); + } + } + + // 以下情况允许登录: + // 1. 前端没有token(Cookie丢失或浏览器关闭后重新打开) + // 2. 前端token与数据库不一致(可能是旧token) + // 自动清理旧token,允许重新登录 - rqrq + sysUserTokenService.forceLogout(user.getUserId()); } session.setAttribute("user", user);