Ver Fonte

令牌过期后自动刷新令牌并推送给前端。

lighter há 4 anos atrás
pai
commit
e2a46dd7b8

+ 1 - 1
pom.xml

@@ -10,7 +10,7 @@
     </parent>
     <groupId>thyyxxk</groupId>
     <artifactId>web-server</artifactId>
-    <version>4.5</version>
+    <version>4.6</version>
     <name>web-server</name>
     <description>server for yibao-web</description>
 

+ 17 - 6
src/main/java/thyyxxk/webserver/config/auth/AuthenticationInterceptor.java

@@ -1,5 +1,6 @@
 package thyyxxk.webserver.config.auth;
 
+import com.alibaba.fastjson.JSONObject;
 import com.auth0.jwt.JWT;
 import com.auth0.jwt.JWTVerifier;
 import com.auth0.jwt.algorithms.Algorithm;
@@ -13,6 +14,8 @@ import thyyxxk.webserver.config.exception.BizException;
 import thyyxxk.webserver.config.exception.ExceptionEnum;
 import thyyxxk.webserver.pojo.login.UserPojo;
 import thyyxxk.webserver.service.LoginService;
+import thyyxxk.webserver.service.TokenService;
+import thyyxxk.webserver.websocket.WebSocketServer;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -22,9 +25,11 @@ import java.lang.reflect.Method;
 @Component
 public class AuthenticationInterceptor implements HandlerInterceptor {
     private final LoginService userService;
+    private final TokenService tokenService;
 
-    public AuthenticationInterceptor(LoginService userService) {
+    public AuthenticationInterceptor(LoginService userService, TokenService tokenService) {
         this.userService = userService;
+        this.tokenService = tokenService;
     }
 
     @Override
@@ -76,11 +81,17 @@ public class AuthenticationInterceptor implements HandlerInterceptor {
         try {
             jwtVerifier.verify(token);
         } catch (JWTVerificationException e) {
-            log.error("验证令牌出错!");
-            log.info("请求来源:{}", request.getRemoteAddr());
-            log.info("请求路径: {}", request.getRequestURI());
-            log.info("请求参数: {}", request.getQueryString());
-            throw new BizException(ExceptionEnum.TOKEN_ERROR);
+            if (e.getMessage().contains("The Token has expired")) {
+                log.warn("【{}-{}】令牌已过期,自动刷新令牌", userPojo.getCode(), userPojo.getName());
+                token = tokenService.getToken(userPojo);
+                JSONObject message = new JSONObject();
+                message.put("name", "refreshToken");
+                message.put("token", token);
+                WebSocketServer.sendMessageByUserCode(userPojo.getCode(), message.toJSONString());
+            } else {
+                log.error("验证令牌出错!");
+                throw new BizException(ExceptionEnum.TOKEN_ERROR);
+            }
         }
         return true;
     }

+ 5 - 2
src/main/java/thyyxxk/webserver/config/auth/InterceptorConfig.java

@@ -5,19 +5,22 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 import thyyxxk.webserver.service.LoginService;
+import thyyxxk.webserver.service.TokenService;
 
 @Configuration
 public class InterceptorConfig implements WebMvcConfigurer {
     private final LoginService service;
+    private final TokenService tokenService;
 
     @Autowired
-    public InterceptorConfig(LoginService service) {
+    public InterceptorConfig(LoginService service, TokenService tokenService) {
         this.service = service;
+        this.tokenService = tokenService;
     }
 
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
-        registry.addInterceptor(new AuthenticationInterceptor(service))
+        registry.addInterceptor(new AuthenticationInterceptor(service, tokenService))
                 .addPathPatterns("/**");
     }
 }

+ 1 - 1
src/main/java/thyyxxk/webserver/service/TokenService.java

@@ -11,7 +11,7 @@ import java.util.Date;
 public class TokenService {
     public String getToken(UserPojo userPojo) {
         Date start = new Date();
-        long currentTime = System.currentTimeMillis() + 60 * 60 * 1000 * 18; //18小时有效时间
+        long currentTime = System.currentTimeMillis() + 60 * 60 * 1000 * 24; //24小时有效时间
         Date end = new Date(currentTime);
         return JWT.create()
                 .withAudience(userPojo.getCode())

+ 15 - 0
src/main/java/thyyxxk/webserver/websocket/WebSocketServer.java

@@ -7,6 +7,7 @@ import javax.websocket.*;
 import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
 import java.io.IOException;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -54,6 +55,20 @@ public class WebSocketServer {
         }
     }
 
+    public static void sendMessageByUserCode(String code, String message) {
+        for (Map.Entry<String, Session> entry : sessionMap.entrySet()) {
+            if (entry.getKey().startsWith(code)) {
+                try {
+                    entry.getValue().getBasicRemote().sendText(message);
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    log.warn("发送socket消息出错>>> {}", e.getMessage());
+                }
+                break;
+            }
+        }
+    }
+
     public static void sendMessageToAll(String message) {
         for (Session session : sessionMap.values()) {
             try {