Procházet zdrojové kódy

处理心跳关闭后端监听不到。后端websocket加入50上限连接

xusl před 1 rokem
rodič
revize
9e1cc0fff2

+ 5 - 0
backend/src/main/java/com/jiayue/ssi/filter/VerifySmFilter.java

@@ -9,6 +9,7 @@ import com.jiayue.ssi.dto.ActiveUserDto;
 import com.jiayue.ssi.entity.SysUser;
 import com.jiayue.ssi.factory.LoginFactory;
 import com.jiayue.ssi.service.SysLogininforService;
+import com.jiayue.ssi.service.WebSocketServer;
 import com.jiayue.ssi.service.impl.UserServiceImpl;
 import com.jiayue.ssi.servlet.ParameterRequestWrapper;
 import com.jiayue.ssi.util.*;
@@ -62,6 +63,10 @@ public class VerifySmFilter extends OncePerRequestFilter {
                 String tokenStr = "";
                 String tokenSign = "";
                 if ("/websocket/testsocket".equals(request.getServletPath())){
+                   if (WebSocketServer.getOnlineCount()+1>50){
+                        ResponseInfo.doResponse(response, "系统心跳探活数量达到上限,用户退出登录稍后再连接!", 407);
+                        return;
+                    }
                     // 心跳
                     tokenStr = request.getParameter("JY");
                     tokenSign = request.getParameter("JySign");

+ 15 - 3
backend/src/main/java/com/jiayue/ssi/service/WebSocketServer.java

@@ -30,8 +30,12 @@ public class WebSocketServer {
     //与某个客户端的连接会话,需要通过它来给客户端发送数据
     private Session session;
 
-    /**
-     * 连接建立成功调用的方法*/
+//    public WebSocketServer() {
+//        log.info("Websocket创建" + new Date().getTime());
+//    }
+
+        /**
+         * 连接建立成功调用的方法*/
     @OnOpen
     public void onOpen(Session session) {
         this.session = session;
@@ -40,6 +44,12 @@ public class WebSocketServer {
             ActiveUserDto activeUserDto = (ActiveUserDto) userProperties.get("ActiveUserDto");
             SysUser sysUser = activeUserDto.getSysUser();
             CacheConstants.SESSIONID_USER_MAP.put(session.getId(),sysUser.getUsername());
+            addOnlineCount();
+//            log.info("连接成功,当前系统心跳连接数:"+getOnlineCount());
+//            if (getOnlineCount()>3){
+//                log.info("超出连接数,关闭本次连接");
+//                onClose(session);
+//            }
             sendMessage("连接成功");
         } catch (Exception e) {
             log.error("websocket IO异常");
@@ -52,6 +62,8 @@ public class WebSocketServer {
     @OnClose
     public void onClose(Session session) {
         try {
+            subOnlineCount();
+//            log.info("断开连接,当前系统心跳连接数:"+getOnlineCount());
             session.close();
         } catch (IOException e) {
             e.printStackTrace();
@@ -85,7 +97,7 @@ public class WebSocketServer {
     @OnError
     public void onError(Session session, Throwable error) {
         log.error("发生错误");
-        error.printStackTrace();
+//        error.printStackTrace();
     }
     /**
      * 实现服务器主动推送

+ 25 - 3
ui/src/layout/components/Sidebar/index.vue

@@ -28,6 +28,8 @@ import { mapGetters, mapState } from "vuex";
 import Logo from "./Logo";
 import SidebarItem from "./SidebarItem";
 import variables from "@/assets/styles/variables.scss";
+import {Message} from "element-ui";
+import router from "@/router";
 
 export default {
     components: { SidebarItem, Logo },
@@ -66,7 +68,8 @@ export default {
       timeoutObj: null, //心跳心跳倒计时
       serverTimeoutObj: null, //心跳倒计时
       timeoutnum: null, //断开 重连倒计时
-      sessionid:null
+      sessionid:null,
+      jumpsign:'1'
     }
 
 
@@ -79,6 +82,7 @@ export default {
   destroyed() {
     //页面销毁时关闭长连接
     clearTimeout(this.timeoutObj);
+    // console.log('销毁页面')
     this.websocketclose();
 
   },
@@ -124,16 +128,34 @@ export default {
       this.start();
     },
     websocketonerror(e) {
+      // Message({
+      //   message: '后端超出探活数量,不允许再次连接',
+      //   type: 'error',
+      //   duration: 5 * 1000
+      // })
+      this.jumpsign='0'
+      this.$alert('后端超出探活数量,不允许再次连接!', {
+        confirmButtonText: '确定',
+        callback: action => {
+          location.replace('about:blank');
+        }
+      });
+
+      // this.$router.push('/404')
       //连接失败事件
       //错误
-      console.log("WebSocket连接发生错误");
+      // console.log("WebSocket连接发生错误");
       //重连
       // this.reconnect();
     },
     websocketclose(e) {
       //连接关闭事件
       //提示关闭
-      // console.log("连接已关闭");
+      if (this.jumpsign=='1'){
+        this.$router.go(0)
+        // console.log("连接已关闭");
+      }
+
       //重连
       // this.reconnect();
     },

+ 8 - 0
ui/src/utils/request.js

@@ -170,6 +170,14 @@ service.interceptors.response.use(
             duration: 5 * 1000
           })
           break
+        case 407:
+          Message({
+            message: error.response.data,
+            type: 'error',
+            duration: 5 * 1000
+          })
+          router.push('/login')
+          break
         case 410:
           removeToken()
           router.push('/404')