From 36894b16f1a6949c55b5995e651a2917dab11eb2 Mon Sep 17 00:00:00 2001 From: haoxr <1490493387@qq.com> Date: Tue, 17 Oct 2023 21:51:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20websocket=20stomp=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=AF=B9=20ws=20=E8=BF=9E=E6=8E=A5=E5=8D=8F=E8=AE=AE=E6=94=AF?= =?UTF-8?q?=E6=8C=81(uni-app=E5=8E=9F=E7=94=9F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../youlai/system/config/WebSocketConfig.java | 12 ++-- .../WebsocketController.java | 6 +- .../WebsocketChannelInterceptor.java} | 10 +-- .../websocket/WebSocketEventListener.java | 64 +++++++++++++++++++ 4 files changed, 76 insertions(+), 16 deletions(-) rename src/main/java/com/youlai/system/{websocket => controller}/WebsocketController.java (91%) rename src/main/java/com/youlai/system/{websocket/interceptor/AuthChannelInterceptor.java => interceptor/WebsocketChannelInterceptor.java} (83%) create mode 100644 src/main/java/com/youlai/system/listener/websocket/WebSocketEventListener.java diff --git a/src/main/java/com/youlai/system/config/WebSocketConfig.java b/src/main/java/com/youlai/system/config/WebSocketConfig.java index 2d0a00d5..2e4a10e9 100644 --- a/src/main/java/com/youlai/system/config/WebSocketConfig.java +++ b/src/main/java/com/youlai/system/config/WebSocketConfig.java @@ -1,6 +1,6 @@ package com.youlai.system.config; -import com.youlai.system.websocket.interceptor.AuthChannelInterceptor; +import com.youlai.system.interceptor.WebsocketChannelInterceptor; import lombok.RequiredArgsConstructor; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Configuration; @@ -22,18 +22,18 @@ import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerCo @RequiredArgsConstructor public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { - private final AuthChannelInterceptor authChannelInterceptor; + private final WebsocketChannelInterceptor websocketChannelInterceptor; /** - * 注册一个端点,客户端通过这个端点进行连接 + * 注册一个端点,客户端通过这个端点进行连接 */ @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry .addEndpoint("/ws") // 注册了一个 /ws 的端点 .setAllowedOriginPatterns("*") // 允许跨域的 WebSocket 连接 - .withSockJS() // 启用 SockJS (浏览器不支持WebSocket,SockJS 将会提供兼容性支持) - ; + .withSockJS(); // 启用 SockJS (浏览器不支持WebSocket,SockJS 将会提供兼容性支持) + registry.addEndpoint("/ws-app").setAllowedOriginPatterns("*"); // 注册了一个 /ws-app 的端点,支持 uni-app 的 ws 连接协议 } @@ -60,6 +60,6 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { */ @Override public void configureClientInboundChannel(ChannelRegistration registration) { - registration.interceptors(authChannelInterceptor); + registration.interceptors(websocketChannelInterceptor); } } diff --git a/src/main/java/com/youlai/system/websocket/WebsocketController.java b/src/main/java/com/youlai/system/controller/WebsocketController.java similarity index 91% rename from src/main/java/com/youlai/system/websocket/WebsocketController.java rename to src/main/java/com/youlai/system/controller/WebsocketController.java index fc25ace2..18d724cb 100644 --- a/src/main/java/com/youlai/system/websocket/WebsocketController.java +++ b/src/main/java/com/youlai/system/controller/WebsocketController.java @@ -1,6 +1,6 @@ -package com.youlai.system.websocket; +package com.youlai.system.controller; -import com.youlai.system.websocket.dto.MessageDTO; +import com.youlai.system.model.dto.SocketMessage; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.messaging.handler.annotation.DestinationVariable; @@ -51,7 +51,7 @@ public class WebsocketController { //@SendToUser(value = "/queue/greeting") public void sendToUser(Principal principal, @DestinationVariable String username, String message) { log.info("sender:{};receiver:{}", principal.getName(), username); - messagingTemplate.convertAndSendToUser(username, "/queue/greeting", new MessageDTO(principal.getName(), message)); + messagingTemplate.convertAndSendToUser(username, "/queue/greeting", new SocketMessage(principal.getName(), message)); /// return "Hello, " + message; } diff --git a/src/main/java/com/youlai/system/websocket/interceptor/AuthChannelInterceptor.java b/src/main/java/com/youlai/system/interceptor/WebsocketChannelInterceptor.java similarity index 83% rename from src/main/java/com/youlai/system/websocket/interceptor/AuthChannelInterceptor.java rename to src/main/java/com/youlai/system/interceptor/WebsocketChannelInterceptor.java index 4ddee32c..c13a71e4 100644 --- a/src/main/java/com/youlai/system/websocket/interceptor/AuthChannelInterceptor.java +++ b/src/main/java/com/youlai/system/interceptor/WebsocketChannelInterceptor.java @@ -1,4 +1,4 @@ -package com.youlai.system.websocket.interceptor; +package com.youlai.system.interceptor; import cn.hutool.core.util.StrUtil; import com.youlai.system.security.jwt.JwtTokenProvider; @@ -21,7 +21,7 @@ import java.security.Principal; */ @Component @RequiredArgsConstructor -public class AuthChannelInterceptor implements ChannelInterceptor { +public class WebsocketChannelInterceptor implements ChannelInterceptor { private final JwtTokenProvider jwtTokenProvider; @@ -38,14 +38,10 @@ public class AuthChannelInterceptor implements ChannelInterceptor { assert accessor != null; if (StompCommand.CONNECT.equals(accessor.getCommand())) { - // get token from header String bearerToken = accessor.getFirstNativeHeader("Authorization"); - // if token is not null if (StrUtil.isNotBlank(bearerToken)) { - - bearerToken = bearerToken.substring(7); + bearerToken = bearerToken.substring(7); // remove "Bearer " String username = jwtTokenProvider.getUsername(bearerToken); - // if the username is not null, assign it to the Principal. if (StrUtil.isNotBlank(username)) { Principal principal = () -> username; accessor.setUser(principal); diff --git a/src/main/java/com/youlai/system/listener/websocket/WebSocketEventListener.java b/src/main/java/com/youlai/system/listener/websocket/WebSocketEventListener.java new file mode 100644 index 00000000..d14fe3d8 --- /dev/null +++ b/src/main/java/com/youlai/system/listener/websocket/WebSocketEventListener.java @@ -0,0 +1,64 @@ +package com.youlai.system.listener.websocket; + +import cn.hutool.json.JSONUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.messaging.SessionConnectedEvent; +import org.springframework.web.socket.messaging.SessionDisconnectEvent; +import org.springframework.web.socket.messaging.SessionSubscribeEvent; +import org.springframework.web.socket.messaging.SessionUnsubscribeEvent; + +/** + * Websocket 客户端事件监听器 + * + * @author haoxr + * @since 2023/10/10 + */ +@Component +@Slf4j +public class WebSocketEventListener { + + /** + * 监听客户端连接事件 + * + * @param event 连接事件对象 + */ + @EventListener + public void handleWebSocketConnectListener(SessionConnectedEvent event) { + log.info("客户端连接成功"); + } + + /** + * 监听客户端断开连接事件 + * + * @param event 断开连接事件对象 + */ + @EventListener + public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) { + log.info("客户端断开连接"); + } + + + /** + * 监听客户端订阅事件 + * + * @param event 订阅事件对象 + */ + @EventListener + public void handleSubscription(SessionSubscribeEvent event) { + log.info("客户端订阅:{}", JSONUtil.toJsonStr(event.getMessage())); + } + + /** + * 监听客户端取消订阅事件 + * + * @param event 取消订阅事件对象 + */ + @EventListener + public void handleUnSubscription(SessionUnsubscribeEvent event) { + log.info("客户端取消订阅:{}", JSONUtil.toJsonStr(event.getMessage())); + } + + +}