Browse Source

fix: 修复登录异常

weijianghai 1 year ago
parent
commit
c33ee923ee

+ 5 - 2
src/main/java/com/nokia/hb/service/AuthService.java

@@ -21,15 +21,18 @@ public class AuthService {
     private final UserMapper userMapper;
     private final UserAreaMapper userAreaMapper;
     private final SessionService sessionService;
+    private final WebSocketService webSocketService;
 
-    public AuthService(UserMapper userMapper, UserAreaMapper userAreaMapper, SessionService sessionService) {
+    public AuthService(UserMapper userMapper, UserAreaMapper userAreaMapper, SessionService sessionService,
+                       WebSocketService webSocketService) {
         this.userMapper = userMapper;
         this.userAreaMapper = userAreaMapper;
         this.sessionService = sessionService;
+        this.webSocketService = webSocketService;
     }
 
     public R<LoginVo> userLogin(LoginDto dto, HttpSession session) {
-        if (sessionService.logged(dto.getUsername())) {
+        if (sessionService.logged(dto.getUsername()) && webSocketService.isConnected(dto.getUsername())) {
             return R.error("账号已在其他设备登录!");
         }
         User user = userMapper.getByUsername(dto.getUsername());

+ 8 - 4
src/main/java/com/nokia/hb/service/WebSocketService.java

@@ -48,12 +48,16 @@ public class WebSocketService extends AbstractWebSocketHandler {
         this.sessionService = sessionService;
     }
 
+    public boolean isConnected(String key) {
+        return SESSION_MAP.get(key) != null;
+    }
+
     @Override
     public void afterConnectionEstablished(WebSocketSession session) throws Exception {
-        SESSION_MAP.put(session.getId(), session);
         Map<String, Object> attributes = session.getAttributes();
         String sessionId = (String) attributes.get("JSESSIONID");
         String username = (String) attributes.get("username");
+        SESSION_MAP.put(username, session);
         log.info("afterConnectionEstablished: {} -> {} -> {}", session.getId(), sessionId, username);
     }
 
@@ -73,7 +77,7 @@ public class WebSocketService extends AbstractWebSocketHandler {
         String username = (String) attributes.get("username");
         log.info("afterConnectionClosed: {}, {} -> {} -> {}", closeStatus, session.getId(), sessionId, username);
         sessionService.invalidate(username);
-        SESSION_MAP.remove(session.getId());
+        SESSION_MAP.remove(username);
     }
     @Override
     protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
@@ -100,8 +104,8 @@ public class WebSocketService extends AbstractWebSocketHandler {
         String username = (String) attributes.get("username");
         log.info("handlePongMessage: {} -> {} -> {} -> {}", session.getId(), sessionId, username,
                 message.getPayload());
-        PING_MAP.put(session.getId(), LocalDateTime.now());
-        TIMEOUT_MAP.put(session.getId(), new AtomicInteger(0));
+        PING_MAP.put(username, LocalDateTime.now());
+        TIMEOUT_MAP.put(username, new AtomicInteger(0));
     }
 
     @Scheduled(fixedDelay = 2000)