Spring Websocket的ChannelInterceptor未触发CONNECT事件。

4
我正在使用Spring编写简单的Stomp Websocket应用程序,客户端既包括Web(Javascript),也包括移动端(iOS、Android)。从JS代码客户端通过SockJS连接,而移动客户端则使用SockJS后面的普通websocket连接。
问题在于,在我的 ChannelInterceptor 中检查身份验证的行为对于不同类型的连接是完全不同的。我无法使其对每个客户端都起作用。让我简要介绍一下代码,并通过示例进行解释:
Websocket starter参考了这里的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. 我可以在MyChannelInterceptorpostSend方法中捕获CONNECT命令- OK
  2. 当我关闭连接时,在同一位置,DISCONNECT命令会触发两次。- 不OK
当我通过SockJS后面的Websocket连接(ws://localhost:8080/gs-guide-websocket/websocket)时:
  1. 我无法在MyChannelInterceptorpostSend方法中捕获CONNECT命令- 严重
  2. 当我关闭连接时,DISCONNECT命令会正确触发一次。- OK
基本上,虽然我不明白为什么SockJS尝试断开两次连接,但我可以接受这种情况。 但是由于我要跟踪用户会话并从此拦截器中精确存储它们,因此我无法使用未能捕获每个连接事件的拦截器。
  • 我已经尝试在配置中删除.withSockJs()并仅连接到套接字-相同的问题
  • 我还尝试在SessionConnectEventSessionConnectedEvent上实现应用程序事件监听器-相同的问题
现在我完全被卡住了,不知道还能从哪里开始... 感谢您关注我的痛苦 =(
1个回答

5
在向Spring Github提交问题并进行交流后,我发现这不是一个错误,基本上也不是一个问题,而只是我的问题:
  • 断开连接(DISCONNECT)的行为是预期的,在Spring WebSocket文档的拦截、事件和监视章节中多次提到。
  • 当通过普通Websockets进行连接时,不应该触发CONNECT事件,因为它仅仅是建立了纯Websocket协议的连接;要使用STOMP客户端来处理STOMP事件。
对于那些感兴趣的人,请参考相应的主题讨论: https://github.com/spring-projects/spring-framework/issues/24269

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接