Kaynağa Gözat

伊宁版本更新:
a.新增sse服务器代码逻辑:全局以会话id为key存储各自会话的通讯链接,心跳包以及登出指令都以当前会话id为基础单位发送指令
b.修改伊宁mainView首页,增加跳转参数clientId用以sse通讯
c.新增sse请求地址获取接口
d.增加weblog前端日志接口
e.更改伊宁逻辑,修改登录缓存逻辑
f.优化sse链接代码

1037015548@qq.com 6 gün önce
ebeveyn
işleme
30284be4e7

+ 3 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SseServlet.java

@@ -67,6 +67,9 @@ public class SseServlet extends BaseController {
                 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
                 return;
             }
+            if(!clientId.contains("___")){
+                return;
+            }
             String reqid = clientId.split("___")[0];
             if (reqid == null || reqid.isEmpty()) {
                 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);

+ 51 - 26
ruoyi-admin/src/main/resources/templates/mainYiningView.html

@@ -389,35 +389,60 @@
 		}
 
 	//TODO sse测试
-    const clientId = 'uniqueClientId123'; // This should be unique for each client
-    const eventSource = new EventSource("/sse/subscribe?clientId="+clientId+"&reqid="+sessionId);
-    for (let i = 0; i < 0; i++) {
-        let eventSourceNNN = new EventSource("/sse/subscribe?clientId="+clientId+"&reqid="+sessionId);
-        console.log("重连次数:"+i);
-    }
-    eventSource.onmessage = function(event) {
-        const newElement = document.createElement("div");
-        newElement.textContent = "Message: "+event.data;
-        console.log(newElement.textContent);
-    };
+    const clientId = 'uniqueClientId123'+"___"+sessionId;
+    let reconnectAttempts = 0;
+    const maxReconnectAttempts = 5;
+    const reconnectDelay = 2000; // 2秒
+
+    let eventSource = null;
+    let reconnecting = false; // 防止重入
+
+    function connect() {
+        if (eventSource) {
+            eventSource.close();
+            eventSource = null;
+        }
+        reconnecting = false;
+        eventSource = new EventSource("/sse/subscribe?clientId="+clientId+"&"+"reqid="+sessionId);
+
+        eventSource.onopen = function() {
+            console.log('SSE连接已建立');
+            reconnectAttempts = 0; // 成功后重置重连次数
+        };
 
-    eventSource.addEventListener('heart', function(event) {
-        const newElement = document.createElement("div");
-        newElement.textContent = "Logout Event:"+event.data;
-        console.log(newElement.textContent);
-    }, false);
+        eventSource.onmessage = function(event) {
+            console.log("Message: " + event.data);
+        };
 
-    eventSource.addEventListener('logout', function(event) {
-        const newElement = document.createElement("div");
-        newElement.textContent = "Logout Event:"+event.data;
-        console.log(newElement.textContent);
-    }, false);
+        eventSource.addEventListener('heart', function(event) {
+            console.log("Heart Event: " + event.data);
+        });
+
+        eventSource.addEventListener('logout', function(event) {
+            console.log("Logout Event: " + event.data);
+            // 收到踢出时可以断开、并选择重连
+            eventSource.close();
+            // 可选:重连
+            setTimeout(connect, reconnectDelay);
+        });
+
+        eventSource.onerror = function(event) {
+            if (reconnecting) return;
+            reconnecting = true; // 防止多次触发
+            console.log("An error occurred! 尝试重连...");
+            // 正常关闭当前连接
+            eventSource.close();
+            if (reconnectAttempts < maxReconnectAttempts) {
+                reconnectAttempts++;
+                setTimeout(connect, reconnectDelay);
+            } else {
+                console.error('已达最大重连次数,停止重连');
+            }
+        };
+    }
 
-    eventSource.onerror = function() {
-        const newElement = document.createElement("div");
-        newElement.textContent = "An error occurred!";
-        console.log(newElement.textContent);
-    };
+    // 初始连接
+    connect();
 </script>
 </body>
 </html>