Spring Websocket ChannelInterceptor不触发CONNECT事件

问题描述 投票:0回答:1

我正在用Spring编写简单的Stomp Websocket应用程序,并且客户端既是Web(JS),又是Mobile(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. 我可以在CONNECT方法中以MyChannelInterceptor捕获postSend命令-确定
  2. [当我关闭连接时,在同一位置,DISCONNECT命令将触发TWICE。 -不好

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

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

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

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

现在我完全被困住了,不知道从这里还能去哪里...感谢您提供任何帮助或起点。

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

java spring websocket stomp sockjs
1个回答
0
投票

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

  • 预期为DISCONNECT的行为。在Spring WebSocket文档的“侦听”,“事件”和“监视”一章下的多个地方都提到了它。
  • 通过纯Websocket连接时,不会触发CONNECT事件,因为它只是通过纯WebSocket协议建立连接,对于STOMP事件,您需要使用STOMP客户端。

对于那些感兴趣的人,请参考相应的主题:https://github.com/spring-projects/spring-framework/issues/24269

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.