From 974f32b268872d234ad14a03ef72899b386ad4c0 Mon Sep 17 00:00:00 2001 From: haoxr <1490493387@qq.com> Date: Thu, 14 Dec 2023 23:36:41 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20websocket=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../youlai/system/config/WebSocketConfig.java | 17 +++++------------ .../system/controller/WebsocketController.java | 2 +- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/youlai/system/config/WebSocketConfig.java b/src/main/java/com/youlai/system/config/WebSocketConfig.java index c44e0fe3..9ef3eccc 100644 --- a/src/main/java/com/youlai/system/config/WebSocketConfig.java +++ b/src/main/java/com/youlai/system/config/WebSocketConfig.java @@ -63,6 +63,8 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { /** * 配置客户端入站通道拦截器 + *
+ * 添加 ChannelInterceptor 拦截器,用于在消息发送前,从请求头中获取 token 并解析出用户信息(username),用于点对点发送消息给指定用户 * * @param registration 通道注册器 */ @@ -72,37 +74,28 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public Message> preSend(Message> message, MessageChannel channel) { StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); - - // 如果 StompHeaderAccessor 为 null,说明不是 STOMP 消息,直接放行 - if (accessor == null) { - return ChannelInterceptor.super.preSend(message, channel); - } - // 如果是连接请求(CONNECT 命令),从请求头中取出 token 并设置到认证信息中 - if (StompCommand.CONNECT.equals(accessor.getCommand())) { + if (accessor != null && StompCommand.CONNECT.equals(accessor.getCommand())) { // 从连接头中提取授权令牌 String bearerToken = accessor.getFirstNativeHeader(HttpHeaders.AUTHORIZATION); // 验证令牌格式并提取用户信息 if (StrUtil.isNotBlank(bearerToken) && bearerToken.startsWith("Bearer ")) { try { - // 移除 "Bearer " 前缀 + // 移除 "Bearer " 前缀,从令牌中提取用户信息(username), 并设置到认证信息中 String tokenWithoutPrefix = bearerToken.substring(7); String username = jwtTokenProvider.getUsername(tokenWithoutPrefix); - // 如果用户名有效,设置用户到访问器中 if (StrUtil.isNotBlank(username)) { accessor.setUser(() -> username); return message; } } catch (Exception e) { - // 异常处理,可能是解析令牌失败 log.error("Failed to process authentication token.", e); } } } - - // 如果不是连接命令或授权失败,继续执行默认逻辑 + // 不是连接请求,直接放行 return ChannelInterceptor.super.preSend(message, channel); } }); diff --git a/src/main/java/com/youlai/system/controller/WebsocketController.java b/src/main/java/com/youlai/system/controller/WebsocketController.java index ed82a66e..0b0d1fe0 100644 --- a/src/main/java/com/youlai/system/controller/WebsocketController.java +++ b/src/main/java/com/youlai/system/controller/WebsocketController.java @@ -54,7 +54,7 @@ public class WebsocketController { String receiver = username; // 接收人 log.info("发送人:{}; 接收人:{}", sender, receiver); - // 发送消息给指定用户 /user/{username}/queue/greeting + // 发送消息给指定用户,拼接后路径 /user/{receiver}/queue/greeting messagingTemplate.convertAndSendToUser(receiver, "/queue/greeting", new ChatMessage(sender, message)); }