Spring SockJs RequestHandler 不会将连接升级到 101
Spring SockJs RequestHandler doesn't upgrade connection to 101
尽管 Spring 文档中没有对此进行描述,但 websocket 连接应该会导致连接升级响应(101 状态)。
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig<S extends ExpiringSession> extends AbstractSessionWebSocketMessageBrokerConfigurer<S>{
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic", "/queue");
config.setApplicationDestinationPrefixes("/mobile-server");
config.setUserDestinationPrefix("/mobile-user");
}
@Override
public void configureStompEndpoints(StompEndpointRegistry registry) {
registry
.addEndpoint("/ws")
.setHandshakeHandler(new DefaultHandshakeHandler(new TomcatRequestUpgradeStrategy()))
.setAllowedOrigins("*")
.withSockJS()
.setSessionCookieNeeded(false)
;
}
}
但是,我得到了一个 200 状态,其中包含一条 "Welcome to SockJS" 消息,该消息由 TransportHandlingSockJsService 生成,而不是生成升级 AFAIK
的 WebSocketHttpRequestHandler
@Configuration
public class WebSocketSecurity extends AbstractSecurityWebSocketMessageBrokerConfigurer{
@Override
protected boolean sameOriginDisabled() {
return true;
}
@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
messages
.nullDestMatcher().permitAll()
.simpSubscribeDestMatchers("/user/queue/errors").permitAll()
.simpDestMatchers("/mobile-server/**").hasRole("ENDUSER")
.simpSubscribeDestMatchers("/user/**", "/topic/**").hasRole("ENDUSER")
.anyMessage().denyAll();
}
}
当我将配置更改为
@Override
public void configureStompEndpoints(StompEndpointRegistry registry) {
registry
.addEndpoint("/ws")
.setHandshakeHandler(new DefaultHandshakeHandler(new TomcatRequestUpgradeStrategy()))
.setAllowedOrigins("*");
}
令我惊讶的是,调用 /ws 确实会导致连接升级 101。我很惊讶,因为文档和所有示例统一使用 withSockJS() 并且任何 websocket 连接的开始 AFAIK 都是请求升级.
我可以选择通过连接到 /ws/websocket(也未记录)来强制升级。所以,我不确定什么是最好的。
有什么建议吗?
这是预期的行为。这就是 SockJS 协议的工作原理:
http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html。有一个初始 "greeting" 请求,然后客户端开始尝试一次传输一个。
尽管 Spring 文档中没有对此进行描述,但 websocket 连接应该会导致连接升级响应(101 状态)。
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig<S extends ExpiringSession> extends AbstractSessionWebSocketMessageBrokerConfigurer<S>{
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic", "/queue");
config.setApplicationDestinationPrefixes("/mobile-server");
config.setUserDestinationPrefix("/mobile-user");
}
@Override
public void configureStompEndpoints(StompEndpointRegistry registry) {
registry
.addEndpoint("/ws")
.setHandshakeHandler(new DefaultHandshakeHandler(new TomcatRequestUpgradeStrategy()))
.setAllowedOrigins("*")
.withSockJS()
.setSessionCookieNeeded(false)
;
}
}
但是,我得到了一个 200 状态,其中包含一条 "Welcome to SockJS" 消息,该消息由 TransportHandlingSockJsService 生成,而不是生成升级 AFAIK
的 WebSocketHttpRequestHandler@Configuration
public class WebSocketSecurity extends AbstractSecurityWebSocketMessageBrokerConfigurer{
@Override
protected boolean sameOriginDisabled() {
return true;
}
@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
messages
.nullDestMatcher().permitAll()
.simpSubscribeDestMatchers("/user/queue/errors").permitAll()
.simpDestMatchers("/mobile-server/**").hasRole("ENDUSER")
.simpSubscribeDestMatchers("/user/**", "/topic/**").hasRole("ENDUSER")
.anyMessage().denyAll();
}
}
当我将配置更改为
@Override
public void configureStompEndpoints(StompEndpointRegistry registry) {
registry
.addEndpoint("/ws")
.setHandshakeHandler(new DefaultHandshakeHandler(new TomcatRequestUpgradeStrategy()))
.setAllowedOrigins("*");
}
令我惊讶的是,调用 /ws 确实会导致连接升级 101。我很惊讶,因为文档和所有示例统一使用 withSockJS() 并且任何 websocket 连接的开始 AFAIK 都是请求升级.
我可以选择通过连接到 /ws/websocket(也未记录)来强制升级。所以,我不确定什么是最好的。
有什么建议吗?
这是预期的行为。这就是 SockJS 协议的工作原理: http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html。有一个初始 "greeting" 请求,然后客户端开始尝试一次传输一个。