【发布时间】:2016-10-13 20:23:00
【问题描述】:
尽管 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 状态,其中包含由 TransportHandlingSockJsService 生成的“欢迎使用 SockJS”消息,而不是生成升级 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 来强制升级(也没有记录)。所以,我不确定什么是最好的。
有什么建议吗?
【问题讨论】:
标签: spring-security spring-websocket spring-session