gpt4 book ai didi

java - Spring Websocket ChannelInterceptor 未触发 CONNECT 事件

转载 作者:行者123 更新时间:2023-12-01 19:12:07 26 4
gpt4 key购买 nike

我正在使用 Spring 编写简单的 Stomp Websocket 应用程序,客户端都是 Web(JS)和移动(ios、android)。 JS 代码客户端通过 SockJS 连接,而移动客户端则在 SockJS 后面使用普通的 websocket 连接。问题是,我检查身份验证的 ChannelInterceptor 中的行为对于不同类型的连接是完全不同的。我无法让它对每个客户都一样有效。让我简要给出一些背后的代码并通过示例进行解释:Websocket 启动器取自 Spring 示例:https://github.com/spring-guides/gs-messaging-stomp-websocket.git

Websocket 配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/gs-guide-websocket")
.setAllowedOrigins("*")
.withSockJS();
}

@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new MyChannelInterceptor());
}
}

ChannelInterceptor本身:

public class MyChannelInterceptor implements ChannelInterceptor {
@Override
public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
StompCommand command = accessor.getCommand();
...
}
}

当我通过 JS 应用程序中的 SockJS 连接时( http://localhost:8080/gs-guide-websocket - 并让 Spring SockJS 完成其余工作):

  1. 我可以在 MyChannelInterceptor 中的 postSend 方法中捕获 CONNECT 命令 - 好的
  2. 当我关闭连接时,在同一位置 DISCONNECT 命令会触发两次。 - 不行

当我通过 SockJS 后面的 Websocket 连接时 (ws://localhost:8080/gs-guide-websocket/websocket):

  1. 我无法在 postSend 方法中的 MyChannelInterceptor 中捕获 CONNECT 命令 - 严重
  2. 当我关闭连接时,DISCONNECT 命令会正确触发一次。 - 好的

基本上,虽然我不明白为什么 sockjs 会尝试断开两次连接,但我可以忍受。但是,由于拦截器无法捕获每个连接事件 - 我无法生存,因为我将跟踪用户 session ,并从该拦截器中存储它们。

  • 我已经尝试删除配置中的 .withSockJs() - 并仅连接到套接字 - 同样的问题
  • 我还尝试在 SessionConnectEventSessionConnectedEvent 上实现应用程序事件监听器 - 同样的问题

现在我完全陷入困境,不知道还能去哪里......感谢任何帮助或起点。

非常感谢您对我的痛苦的关注=(

最佳答案

在 Spring Github 上发布问题并在那里进行交谈后,我发现这不是一个错误,基本上不是一个问题,而只是我的错:

  • DISCONNECT 行为是正常的。 Spring WebSocket 文档的“拦截”、“事件”和“监控”章节中的多个地方都提到了它。
  • 通过普通 Websocket 连接时预计不会触发 CONNECT 事件,因为它只是通过普通 WebSocket 协议(protocol)建立连接,对于 STOMP 事件,您需要使用 STOMP 客户端。

有兴趣的请参阅相应的帖子: https://github.com/spring-projects/spring-framework/issues/24269

关于java - Spring Websocket ChannelInterceptor 未触发 CONNECT 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59470938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com