Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Websocket通道侦听器未触发连接事件_Java_Spring_Websocket_Stomp_Sockjs - Fatal编程技术网

Java Spring Websocket通道侦听器未触发连接事件

Java Spring Websocket通道侦听器未触发连接事件,java,spring,websocket,stomp,sockjs,Java,Spring,Websocket,Stomp,Sockjs,我正在用Spring编写简单的Stomp Websocket应用程序,客户端既有web(JS),也有移动(ios、android)。从JS代码客户端通过SockJS连接,而移动客户端在SockJS后面使用普通websocket连接。 问题是,我检查身份验证的通道拦截器中的行为对于不同类型的连接是完全不同的。我不能让每个客户都这样做。 让我简单地给出一些代码,并举例说明: Websocket启动器取自此处的Spring示例: Websocket配置: @Configuration @EnableW

我正在用Spring编写简单的Stomp Websocket应用程序,客户端既有web(JS),也有移动(ios、android)。从JS代码客户端通过SockJS连接,而移动客户端在SockJS后面使用普通websocket连接。 问题是,我检查身份验证的
通道拦截器中的行为对于不同类型的连接是完全不同的。我不能让每个客户都这样做。
让我简单地给出一些代码,并举例说明:
Websocket启动器取自此处的Spring示例:

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());
    }
}
和通道拦截器本身:

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();
        ...
    }
}
公共类MyChannelInterceptor实现ChannelInterceptor{
@凌驾
public void postSend(消息消息、消息通道、布尔发送){
StompHeaderAccessor accessor=MessageHeaderAccessor.getAccessor(message,StompHeaderAccessor.class);
StompCommand=accessor.getCommand();
...
}
}
当我从JS应用程序通过SockJS连接时(剩下的由Spring SockJS完成):

  • 我可以在
    MyChannelInterceptor
    postSend
    方法中捕获
    CONNECT
    命令-确定
  • 当我关闭连接时,在同一个位置
    DISCONNECT
    命令触发两次。-不好
  • 当我通过SockJS后面的Websocket连接时(ws://localhost:8080/gs-guide-Websocket/Websocket):

  • 我无法在
    MyChannelInterceptor
    postSend
    方法-关键中捕获
    CONNECT
    命令
  • 当我关闭连接时,
    DISCONNECT
    命令正确触发一次。-嗯
  • 基本上,虽然我不明白为什么sockjs两次尝试断开连接,但我可以接受它。 但由于拦截器并没有捕获每个连接事件,我无法生存,因为我将跟踪用户会话,并从拦截器中存储它们

    • 我已经尝试在配置中删除
      .withSockJs()
      ,然后只连接到套接字-同样的问题
    • 我还尝试在
      SessionConnectEvent
      SessionConnectedEvent
      上实现应用程序事件侦听器-同样的问题
    现在我完全被困住了,不知道我还能去哪里。。。 任何帮助或出发点都将不胜感激


    非常感谢大家关注我的痛苦=(

    在将一个问题发布到Spring Github并在那里交谈之后,我发现这不是一个bug,基本上也不是一个问题,只是我的错:

    • 断开连接的行为是预期的。在SpringWebSocket文档中的拦截、事件和监视章节中有几个地方提到了它
    • 当通过普通WebSocket连接时,预计不会触发CONNECT事件,因为它只是通过普通WebSocket协议建立连接,对于STOMP事件,您需要使用STOMP客户端
    对于感兴趣的人,请参考相应的线程: