From 6bc572ff792f4bb494b1e86ee27755ad44c5cb56 Mon Sep 17 00:00:00 2001 From: zhanglipeng Date: Thu, 21 Jan 2021 11:56:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E4=B8=80=E8=B4=A6=E5=8F=B7=E5=8F=AA?= =?UTF-8?q?=E8=83=BD=E5=8D=95=E6=AC=A1=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/constant/HttpStatus.java | 5 ++++ .../common/exception/CustomException.java | 10 ++++++++ .../security/service/SysLoginService.java | 25 +++++++++++++++++++ .../framework/web/domain/AjaxResult.java | 13 ++++++++++ .../web/exception/GlobalExceptionHandler.java | 3 +++ .../system/controller/SysLoginController.java | 19 ++++++++++++++ 6 files changed, 75 insertions(+) diff --git a/ruoyi/src/main/java/com/ruoyi/common/constant/HttpStatus.java b/ruoyi/src/main/java/com/ruoyi/common/constant/HttpStatus.java index ffdb56d0d..6335bc2eb 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/constant/HttpStatus.java +++ b/ruoyi/src/main/java/com/ruoyi/common/constant/HttpStatus.java @@ -86,4 +86,9 @@ public interface HttpStatus * 接口未实现 */ public static final int NOT_IMPLEMENTED = 501; + + /** + * 已登陆 + */ + public static final int ALREADY_LOGIN = 502; } diff --git a/ruoyi/src/main/java/com/ruoyi/common/exception/CustomException.java b/ruoyi/src/main/java/com/ruoyi/common/exception/CustomException.java index a99a1001c..b5f9cd176 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/exception/CustomException.java +++ b/ruoyi/src/main/java/com/ruoyi/common/exception/CustomException.java @@ -13,6 +13,16 @@ public class CustomException extends RuntimeException private String message; + public String getObj() { + return obj; + } + + public void setObj(String obj) { + this.obj = obj; + } + + private String obj; + public CustomException(String message) { this.message = message; diff --git a/ruoyi/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java b/ruoyi/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java index 4f99044ef..3a6152d5a 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/security/service/SysLoginService.java @@ -1,6 +1,10 @@ package com.ruoyi.framework.security.service; import javax.annotation.Resource; + +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.project.monitor.domain.SysUserOnline; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; @@ -18,6 +22,10 @@ import com.ruoyi.framework.manager.factory.AsyncFactory; import com.ruoyi.framework.redis.RedisCache; import com.ruoyi.framework.security.LoginUser; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + /** * 登录校验方法 * @@ -80,6 +88,23 @@ public class SysLoginService throw new CustomException(e.getMessage()); } } + + Collection keys = redisCache.keys(Constants.LOGIN_TOKEN_KEY + "*"); + List userOnlineList = new ArrayList(); + for (String key : keys) { + LoginUser user = redisCache.getCacheObject(key); + if (StringUtils.isNotEmpty(username) && StringUtils.isNotNull(user.getUser())) + { + if (StringUtils.equals(username, user.getUsername())) + { + //存在已经登录用户,抛出异常 + CustomException alreadyLoginExcep = new CustomException("该账号已在别处登陆", HttpStatus.ALREADY_LOGIN); + alreadyLoginExcep.setObj(username); + throw alreadyLoginExcep; + } + } + } + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); LoginUser loginUser = (LoginUser) authentication.getPrincipal(); // 生成token diff --git a/ruoyi/src/main/java/com/ruoyi/framework/web/domain/AjaxResult.java b/ruoyi/src/main/java/com/ruoyi/framework/web/domain/AjaxResult.java index 5c551bd7b..945503680 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/web/domain/AjaxResult.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/web/domain/AjaxResult.java @@ -145,4 +145,17 @@ public class AjaxResult extends HashMap { return new AjaxResult(code, msg, null); } + + + /** + * 返回错误消息 + * + * @param code 状态码 + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult error(int code, String msg, Object data) + { + return new AjaxResult(code, msg, data); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java index 12b4358df..82f678709 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -46,6 +46,9 @@ public class GlobalExceptionHandler { return AjaxResult.error(e.getMessage()); } + if (e.getObj()!=null){ + return AjaxResult.error(e.getCode(),e.getMessage(),e.getObj()); + } return AjaxResult.error(e.getCode(), e.getMessage()); } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java index 6871d836a..e2fc9ffeb 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java @@ -2,6 +2,8 @@ package com.ruoyi.project.system.controller; import java.util.List; import java.util.Set; + +import com.ruoyi.framework.redis.RedisCache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -39,6 +41,9 @@ public class SysLoginController @Autowired private TokenService tokenService; +// @Autowired +// private RedisCache redisCache; + /** * 登录方法 * @@ -59,6 +64,20 @@ public class SysLoginController return ajax; } +// /** +// * 将在其他地方登陆的账号强退 +// * +// * @param user 登录信息 +// * @return 结果 +// */ +// @PostMapping("/forceLogout") +// public AjaxResult forcelogin(@RequestBody LoginUser user) +// { +// redisCache.deleteObject(Constants.LOGIN_TOKEN_KEY + user.getToken()); +// +// return AjaxResult.success(); +// } + /** * 获取用户信息 *