hexiao 2 年 前
コミット
84c12fdfde

+ 20 - 31
purchase-admin/src/main/java/com/ozs/web/controller/monitor/SysUserOnlineController.java

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.DeleteMapping;
@@ -30,8 +31,7 @@ import com.ozs.system.service.ISysUserOnlineService;
  */
 @RestController
 @RequestMapping("/monitor/online")
-public class SysUserOnlineController extends BaseController
-{
+public class SysUserOnlineController extends BaseController {
     @Autowired
     private ISysUserOnlineService userOnlineService;
 
@@ -40,38 +40,28 @@ public class SysUserOnlineController extends BaseController
 
     @PreAuthorize("@ss.hasPermi('monitor:online:list')")
     @GetMapping("/list")
-    public TableDataInfo list(String ipaddr, String userName)
-    {
+    public TableDataInfo list(String ipaddr, String userName) {
         Collection<String> keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
         List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
-        for (String key : keys)
-        {
+        for (String key : keys) {
             LoginUser user = redisCache.getCacheObject(key);
-            if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName))
-            {
-                if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername()))
-                {
-                    userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
-                }
-            }
-            else if (StringUtils.isNotEmpty(ipaddr))
-            {
-                if (StringUtils.equals(ipaddr, user.getIpaddr()))
-                {
-                    userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
+            if (!user.getUserId().equals(Long.parseLong("-1"))) {
+                if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) {
+                    if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) {
+                        userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
+                    }
+                } else if (StringUtils.isNotEmpty(ipaddr)) {
+                    if (StringUtils.equals(ipaddr, user.getIpaddr())) {
+                        userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
+                    }
+                } else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) {
+                    if (StringUtils.equals(userName, user.getUsername())) {
+                        userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
+                    }
+                } else {
+                    userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
                 }
             }
-            else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser()))
-            {
-                if (StringUtils.equals(userName, user.getUsername()))
-                {
-                    userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
-                }
-            }
-            else
-            {
-                userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
-            }
         }
         Collections.reverse(userOnlineList);
         userOnlineList.removeAll(Collections.singleton(null));
@@ -84,8 +74,7 @@ public class SysUserOnlineController extends BaseController
     @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
     @Log(title = "在线用户", businessType = BusinessType.FORCE)
     @DeleteMapping("/{tokenId}")
-    public AjaxResult forceLogout(@PathVariable String tokenId)
-    {
+    public AjaxResult forceLogout(@PathVariable String tokenId) {
         redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
         return success();
     }

+ 4 - 2
purchase-admin/src/main/java/com/ozs/web/controller/system/SysLoginController.java

@@ -117,8 +117,10 @@ public class SysLoginController
             String userName = loginUser.getUsername();
             // 删除用户缓存记录
             tokenService.delLoginUser(loginUser.getToken());
-            // 记录用户退出日志
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功"));
+            if (!loginUser.getUserId().equals(Long.parseLong("-1"))) {
+                // 记录用户退出日志
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功"));
+            }
         }
         return ajax;
     }

+ 8 - 3
purchase-admin/src/main/java/com/ozs/web/filter/LogOutFilter.java

@@ -6,6 +6,7 @@ import ch.qos.logback.core.spi.FilterReply;
 import com.ozs.common.constant.Constants;
 import com.ozs.common.utils.SecurityUtils;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.ObjectUtils;
 
 @Slf4j
 public class LogOutFilter extends Filter<ILoggingEvent> {
@@ -13,11 +14,15 @@ public class LogOutFilter extends Filter<ILoggingEvent> {
 
     @Override
     public FilterReply decide(ILoggingEvent event) {
-        if (Constants.FLAY) {
+        String s = Constants.localVar.get();
+        if (!ObjectUtils.isEmpty(s)) {
             Long userId = SecurityUtils.getUserId();
-            if (userId.equals(Long.parseLong("1"))) {
-                return FilterReply.DENY;
+            if (!ObjectUtils.isEmpty(userId)) {
+                if (userId.equals(Long.parseLong("-1"))) {
+                    return FilterReply.DENY;
+                }
             }
+
         }
         return FilterReply.ACCEPT;
     }

+ 10 - 5
purchase-common/src/main/java/com/ozs/common/constant/Constants.java

@@ -1,17 +1,22 @@
 package com.ozs.common.constant;
 
+import com.ozs.common.core.domain.model.LoginUser;
 import io.jsonwebtoken.Claims;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * 通用常量信息
  *
  * @author ruoyi
  */
 public class Constants {
-    /**
-     * UTF-8 字符集
-     */
-    public static final String UTF8 = "UTF-8";
+ public static ThreadLocal<String> localVar = new ThreadLocal<String>();
+ /**
+  * UTF-8 字符集
+  */
+ public static final String UTF8 = "UTF-8";
 
     /**
      * GBK 字符集
@@ -163,5 +168,5 @@ public class Constants {
     // 单位性质
     public static final String SYS_COMPANY_NATURE = "sys_company_nature";
 
-    public static boolean FLAY = false;
+ public static Map<String, LoginUser> map = new HashMap<>();
 }

+ 3 - 1
purchase-framework/src/main/java/com/ozs/framework/security/filter/JwtAuthenticationTokenFilter.java

@@ -34,7 +34,9 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
         LoginUser loginUser = tokenService.getLoginUser(request);
         if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))
         {
-            tokenService.verifyToken(loginUser);
+            if (!loginUser.getUserId().equals(Long.parseLong("-1"))) {
+                tokenService.verifyToken(loginUser);
+            }
             UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
             authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
             SecurityContextHolder.getContext().setAuthentication(authenticationToken);

+ 6 - 7
purchase-framework/src/main/java/com/ozs/framework/web/service/SysLoginService.java

@@ -70,13 +70,16 @@ public class SysLoginService {
             LoginUser loginUser = new LoginUser();
             SysUser user = new SysUser();
             user.setUserId(-1L);
-//            user.setPassword(password);
             user.setUserName(username);
             loginUser.setUser(user);
             loginUser.setUserId(-1L);
-            recordLoginInfo(loginUser.getUserId());
             // 生成token
-            return tokenService.createToken(loginUser);
+            String token = tokenService.createToken(loginUser);
+            Constants.localVar.remove();
+            Constants.localVar.set(token);
+            Constants.map.clear();
+            Constants.map.put(token, loginUser);
+            return token;
         }else {
             // 验证码开关
             if (captchaEnabled)
@@ -112,10 +115,6 @@ public class SysLoginService {
             AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
             LoginUser loginUser = (LoginUser) authentication.getPrincipal();
             recordLoginInfo(loginUser.getUserId());
-            // 生成token
-            Constants.FLAY = true;
-            log.info("******【" + Constants.FLAY + "】*******");
-
             return tokenService.createToken(loginUser);
         }
 

+ 35 - 42
purchase-framework/src/main/java/com/ozs/framework/web/service/TokenService.java

@@ -4,6 +4,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import javax.servlet.http.HttpServletRequest;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
@@ -20,6 +21,7 @@ import eu.bitwalker.useragentutils.UserAgent;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
+import org.springframework.util.ObjectUtils;
 
 /**
  * token验证处理
@@ -27,8 +29,7 @@ import io.jsonwebtoken.SignatureAlgorithm;
  * @author ruoyi
  */
 @Component
-public class TokenService
-{
+public class TokenService {
     // 令牌自定义标识
     @Value("${token.header}")
     private String header;
@@ -55,23 +56,26 @@ public class TokenService
      *
      * @return 用户信息
      */
-    public LoginUser getLoginUser(HttpServletRequest request)
-    {
+    public LoginUser getLoginUser(HttpServletRequest request) {
         // 获取请求携带的令牌
         String token = getToken(request);
-        if (StringUtils.isNotEmpty(token))
-        {
-            try
-            {
+        if (StringUtils.isNotEmpty(token)) {
+            try {
                 Claims claims = parseToken(token);
                 // 解析对应的权限以及用户信息
                 String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
+
+                if (!ObjectUtils.isEmpty(Constants.map.keySet())) {
+                    for (String s : Constants.map.keySet()) {
+                        if (s.equals(token)) {
+                            return Constants.map.get(s);
+                        }
+                    }
+                }
                 String userKey = getTokenKey(uuid);
                 LoginUser user = redisCache.getCacheObject(userKey);
                 return user;
-            }
-            catch (Exception e)
-            {
+            } catch (Exception e) {
             }
         }
         return null;
@@ -80,10 +84,8 @@ public class TokenService
     /**
      * 设置用户身份信息
      */
-    public void setLoginUser(LoginUser loginUser)
-    {
-        if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken()))
-        {
+    public void setLoginUser(LoginUser loginUser) {
+        if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) {
             refreshToken(loginUser);
         }
     }
@@ -91,10 +93,8 @@ public class TokenService
     /**
      * 删除用户身份信息
      */
-    public void delLoginUser(String token)
-    {
-        if (StringUtils.isNotEmpty(token))
-        {
+    public void delLoginUser(String token) {
+        if (StringUtils.isNotEmpty(token)) {
             String userKey = getTokenKey(token);
             redisCache.deleteObject(userKey);
         }
@@ -106,12 +106,15 @@ public class TokenService
      * @param loginUser 用户信息
      * @return 令牌
      */
-    public String createToken(LoginUser loginUser)
-    {
+    public String createToken(LoginUser loginUser) {
         String token = IdUtils.fastUUID();
         loginUser.setToken(token);
         setUserAgent(loginUser);
-        refreshToken(loginUser);
+
+        if (!loginUser.getUserId().equals(Long.parseLong("-1"))) {
+            refreshToken(loginUser);
+        }
+
 
         Map<String, Object> claims = new HashMap<>();
         claims.put(Constants.LOGIN_USER_KEY, token);
@@ -124,12 +127,10 @@ public class TokenService
      * @param loginUser
      * @return 令牌
      */
-    public void verifyToken(LoginUser loginUser)
-    {
+    public void verifyToken(LoginUser loginUser) {
         long expireTime = loginUser.getExpireTime();
         long currentTime = System.currentTimeMillis();
-        if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
-        {
+        if (expireTime - currentTime <= MILLIS_MINUTE_TEN) {
             refreshToken(loginUser);
         }
     }
@@ -139,8 +140,7 @@ public class TokenService
      *
      * @param loginUser 登录信息
      */
-    public void refreshToken(LoginUser loginUser)
-    {
+    public void refreshToken(LoginUser loginUser) {
         loginUser.setLoginTime(System.currentTimeMillis());
         loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
         // 根据uuid将loginUser缓存
@@ -153,8 +153,7 @@ public class TokenService
      *
      * @param loginUser 登录信息
      */
-    public void setUserAgent(LoginUser loginUser)
-    {
+    public void setUserAgent(LoginUser loginUser) {
         UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
         String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
         loginUser.setIpaddr(ip);
@@ -169,8 +168,7 @@ public class TokenService
      * @param claims 数据声明
      * @return 令牌
      */
-    private String createToken(Map<String, Object> claims)
-    {
+    private String createToken(Map<String, Object> claims) {
         String token = Jwts.builder()
                 .setClaims(claims)
                 .signWith(SignatureAlgorithm.HS512, secret).compact();
@@ -183,8 +181,7 @@ public class TokenService
      * @param token 令牌
      * @return 数据声明
      */
-    private Claims parseToken(String token)
-    {
+    private Claims parseToken(String token) {
         return Jwts.parser()
                 .setSigningKey(secret)
                 .parseClaimsJws(token)
@@ -197,8 +194,7 @@ public class TokenService
      * @param token 令牌
      * @return 用户名
      */
-    public String getUsernameFromToken(String token)
-    {
+    public String getUsernameFromToken(String token) {
         Claims claims = parseToken(token);
         return claims.getSubject();
     }
@@ -209,18 +205,15 @@ public class TokenService
      * @param request
      * @return token
      */
-    private String getToken(HttpServletRequest request)
-    {
+    private String getToken(HttpServletRequest request) {
         String token = request.getHeader(header);
-        if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX))
-        {
+        if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) {
             token = token.replace(Constants.TOKEN_PREFIX, "");
         }
         return token;
     }
 
-    private String getTokenKey(String uuid)
-    {
+    private String getTokenKey(String uuid) {
         return CacheConstants.LOGIN_TOKEN_KEY + uuid;
     }
 }