我正在用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完成其余工作:]
CONNECT
方法中以MyChannelInterceptor
捕获postSend
命令-确定DISCONNECT
命令将触发TWICE。 -不好当我通过SockJS(ws:// localhost:8080 / gs-guide-websocket / websocket)后面的Websocket连接时:
CONNECT
方法中以MyChannelInterceptor
的方式捕获postSend
命令-严重DISCONNECT
命令一次正确触发。 -好[基本上,虽然我不明白为什么sockjs试图断开两次连接,但我可以忍受。但是由于拦截器无法捕获每个连接事件,因此我无法生存,因为我要跟踪用户会话,并从该拦截器中存储它们。
.withSockJs()
-只是连接到套接字-同样的问题SessionConnectEvent
和SessionConnectedEvent
上实现应用程序事件侦听器-相同的问题现在我完全被困住了,不知道从这里还能去哪里...感谢您提供任何帮助或起点。
非常感谢您对我的痛苦=(
向Spring Github发布问题并在那里进行了交谈之后,我发现这不是bug,基本上不是问题,而只是我的错:
对于那些感兴趣的人,请参考相应的主题:https://github.com/spring-projects/spring-framework/issues/24269