From 1c8fc0c81145aa71bc4a9dd77c69eb00cf064c9f Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Thu, 9 Oct 2025 18:50:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96websocket=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/sn/DevicesInfoController.java | 27 +++++++++++++++++ .../handler/CustomWebSocketHandler.java | 29 +++++++++++++++---- .../interceptor/AuthHandshakeInterceptor.java | 16 ++++++++-- 3 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/onekeycall/videotablet/controller/sn/DevicesInfoController.java diff --git a/src/main/java/com/onekeycall/videotablet/controller/sn/DevicesInfoController.java b/src/main/java/com/onekeycall/videotablet/controller/sn/DevicesInfoController.java new file mode 100644 index 0000000..379df84 --- /dev/null +++ b/src/main/java/com/onekeycall/videotablet/controller/sn/DevicesInfoController.java @@ -0,0 +1,27 @@ +package com.onekeycall.videotablet.controller.sn; + +import com.onekeycall.videotablet.entity.DeviceInfo; +import com.onekeycall.videotablet.result.Result; +import com.onekeycall.videotablet.service.DeviceSnService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/sn") +public class DevicesInfoController { + @Autowired + private DeviceSnService deviceSnService; + + @PostMapping("/update_device_info") + public Result update_device_info( + @RequestParam String sn, + @RequestParam(required = false) String device_alias, + @RequestParam(required = false) String device_model + ) { + DeviceInfo deviceInfo = deviceSnService.findBySn(sn); + return Result.ok(); + } +} diff --git a/src/main/java/com/onekeycall/videotablet/handler/CustomWebSocketHandler.java b/src/main/java/com/onekeycall/videotablet/handler/CustomWebSocketHandler.java index 923c362..49a12de 100644 --- a/src/main/java/com/onekeycall/videotablet/handler/CustomWebSocketHandler.java +++ b/src/main/java/com/onekeycall/videotablet/handler/CustomWebSocketHandler.java @@ -2,12 +2,15 @@ package com.onekeycall.videotablet.handler; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import org.springframework.util.MultiValueMap; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; +import org.springframework.web.util.UriComponentsBuilder; import java.io.IOException; +import java.net.URI; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -19,12 +22,23 @@ public class CustomWebSocketHandler extends TextWebSocketHandler { private final Map sessions = new ConcurrentHashMap<>(); - @Override - public void afterConnectionEstablished(WebSocketSession session) { + public void afterConnectionEstablished(WebSocketSession session) throws IOException { +// URI uri = session.getUri(); +// if (uri == null) { +// return; +// } +// MultiValueMap queryParams = UriComponentsBuilder.fromUri(uri).build().getQueryParams(); +// String sn = queryParams.getFirst("sn"); +// log.info("sn = " + sn); +// if (sn == null) { +// session.close(CloseStatus.BAD_DATA.withReason("Missing device SN")); +// return; +// } String sessionId = session.getId(); - sessions.put(sessionId, session); - log.info("✅ 连接建立: ID={}, 当前连接数: {}", sessionId, sessions.size()); + String sn = (String) session.getAttributes().get("sn"); + sessions.put(sn, session); + log.info("✅ 连接建立: ID={},sn={},当前连接数: {}", sessionId, sn, sessions.size()); } @Override @@ -32,6 +46,7 @@ public class CustomWebSocketHandler extends TextWebSocketHandler { String payload = message.getPayload(); log.info("📩 收到消息: {}", payload); + // 示例:回复客户端 String reply = "服务器已接收: " + payload; try { @@ -47,8 +62,10 @@ public class CustomWebSocketHandler extends TextWebSocketHandler { @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { String sessionId = session.getId(); - sessions.remove(sessionId); - log.info("❌ 连接关闭: ID={}, 原因: {}", sessionId, status.getReason()); + String sn = (String) session.getAttributes().get("sn"); + sessions.remove(sn); + log.info("❌ 连接关闭: ID={},sn={},Code: {},原因: {},当前连接数: {}", sessionId, sn, status.getCode(), status.getReason(), sessions.size()); + } // 广播消息给所有客户端 diff --git a/src/main/java/com/onekeycall/videotablet/interceptor/AuthHandshakeInterceptor.java b/src/main/java/com/onekeycall/videotablet/interceptor/AuthHandshakeInterceptor.java index f19cb6a..7c7551a 100644 --- a/src/main/java/com/onekeycall/videotablet/interceptor/AuthHandshakeInterceptor.java +++ b/src/main/java/com/onekeycall/videotablet/interceptor/AuthHandshakeInterceptor.java @@ -1,13 +1,17 @@ package com.onekeycall.videotablet.interceptor; import com.onekeycall.videotablet.utils.JwtUtil; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; +import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.server.HandshakeInterceptor; import java.util.Map; +@Slf4j public class AuthHandshakeInterceptor implements HandshakeInterceptor { private final JwtUtil jwtUtil; @@ -20,9 +24,17 @@ public class AuthHandshakeInterceptor implements HandshakeInterceptor { public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception { String authHeader = request.getHeaders().getFirst("Authorization"); String deviceId = request.getHeaders().getFirst("Device-ID"); - String userId = request.getHeaders().getFirst("user_id"); + String userId = request.getHeaders().getFirst("User-ID"); - if (authHeader == null || !authHeader.startsWith("Bearer ")||userId==null) { + if (request instanceof ServletServerHttpRequest) { + ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; + HttpServletRequest httpRequest = servletRequest.getServletRequest(); + String sn = httpRequest.getParameter("sn"); + attributes.put("sn", sn); + log.info("Intercepted - sn: " + sn); + } + + if (authHeader == null || !authHeader.startsWith("Bearer ") || userId == null) { return false; } String token = authHeader.substring(7); // 去掉 "Bearer " 前缀