From e7df85fdfa3925961512b1e77aa5ffec1be692be Mon Sep 17 00:00:00 2001 From: weidong Date: Thu, 16 Nov 2023 18:16:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=91=BD=E4=BB=A4=E8=A1=8C?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../beidou/config/WebSocketConfig.java | 22 +++++++++++++++++-- .../beidou/controller/CmdLineController.java | 4 +++- .../beidou/controller/WebSocketServer.java | 22 +++++++++++++------ .../beidou/controller/WebsocketListener.java | 22 +++++++++++++++++++ .../src/main/resources/templates/index.html | 2 +- 5 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 sec-beidou/src/main/java/com/imdroid/beidou/controller/WebsocketListener.java diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/config/WebSocketConfig.java b/sec-beidou/src/main/java/com/imdroid/beidou/config/WebSocketConfig.java index 6b76a052..4c20f13d 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/config/WebSocketConfig.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/config/WebSocketConfig.java @@ -4,10 +4,28 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +import javax.servlet.http.HttpSession; +import javax.websocket.HandshakeResponse; +import javax.websocket.server.HandshakeRequest; +import javax.websocket.server.ServerEndpointConfig; + @Configuration -public class WebSocketConfig { +public class WebSocketConfig extends ServerEndpointConfig.Configurator{ + + /* 修改握手,就是在握手协议建立之前修改其中携带的内容 */ + @Override + public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { + HttpSession httpSession = (HttpSession)request.getHttpSession(); + if (httpSession != null) { + // 读取session域中存储的数据 + sec.getUserProperties().put(HttpSession.class.getName(),httpSession); + } + super.modifyHandshake(sec, request, response); + } + @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); } -} +} \ No newline at end of file diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/CmdLineController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/CmdLineController.java index b30cb525..5256783e 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/CmdLineController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/CmdLineController.java @@ -38,7 +38,8 @@ public class CmdLineController extends BasicController{ /****** 发送指令 *******/ @PostMapping(value = "/gnss/config_cmd") @ResponseBody - public HttpResult configCmd(@RequestParam("tx_win") String cmd, + public HttpResult configCmd(HttpSession session, + @RequestParam("tx_win") String cmd, @RequestParam("device_id") String deviceId, @RequestParam("cmd_type") int cmdType) { String sendCmd = cmd.replaceAll(" +",""); @@ -74,6 +75,7 @@ public class CmdLineController extends BasicController{ // 保存 GnssMsg gnssMsg = new GnssMsg(); + gnssMsg.setTenantid(getTenantId(session)); gnssMsg.setCreatetime(new Date()); gnssMsg.setDeviceid(deviceId); gnssMsg.setMsgtype(msgType); diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/WebSocketServer.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/WebSocketServer.java index 84d0303f..8b3658c3 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/WebSocketServer.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/WebSocketServer.java @@ -1,31 +1,38 @@ package com.imdroid.beidou.controller; +import com.imdroid.beidou.config.WebSocketConfig; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import javax.servlet.http.HttpSession; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; -import java.util.concurrent.CopyOnWriteArraySet; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; //单例 -@ServerEndpoint("/websocket") + +@ServerEndpoint(value = "/websocket",configurator = WebSocketConfig.class) @Component @Slf4j public class WebSocketServer { // thread safety counter // thread safety set to hold websocket objects - private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet<>(); + private static Map webSocketSet = new ConcurrentHashMap<>(); @OnOpen public void onOpen(Session session){ - webSocketSet.add(session); + HttpSession httpSession= (HttpSession) session.getUserProperties().get(HttpSession.class.getName()); + webSocketSet.put(httpSession.getId(), session); log.info("new websocket opened, total socket num: "+ webSocketSet.size()); - } @OnClose public void onClose(Session session){ - webSocketSet.remove(session); + HttpSession httpSession= (HttpSession) session.getUserProperties().get(HttpSession.class.getName()); + if(httpSession!=null) { + webSocketSet.remove(httpSession.getId()); + } log.info("websocket closed, total socket num: "+ webSocketSet.size()); } @@ -41,7 +48,7 @@ public class WebSocketServer { public static void sendMessageToAll(String msg){ try { - for (Session item : webSocketSet) { + for (Session item : webSocketSet.values()) { item.getBasicRemote().sendText(msg); } } @@ -49,4 +56,5 @@ public class WebSocketServer { log.error("websocket send msg error:", e); } } + } diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/WebsocketListener.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/WebsocketListener.java new file mode 100644 index 00000000..dfdc91e3 --- /dev/null +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/WebsocketListener.java @@ -0,0 +1,22 @@ +package com.imdroid.beidou.controller; + + +import org.springframework.stereotype.Component; + +import javax.servlet.ServletRequestEvent; +import javax.servlet.ServletRequestListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +@Component +public class WebsocketListener implements ServletRequestListener{ + @Override + public void requestInitialized(ServletRequestEvent sre) { + HttpSession session = ((HttpServletRequest) sre.getServletRequest()).getSession(); + } + + public WebsocketListener(){} + + @Override + public void requestDestroyed(ServletRequestEvent arg0) {} +} diff --git a/sec-beidou/src/main/resources/templates/index.html b/sec-beidou/src/main/resources/templates/index.html index 85fbdb58..5137b07e 100644 --- a/sec-beidou/src/main/resources/templates/index.html +++ b/sec-beidou/src/main/resources/templates/index.html @@ -73,7 +73,7 @@
- +