Несмотря на то, что это не описано в документации Spring, подключение к websocket должно привести к ответу обновления соединения (состояние 101).Spring SockJs RequestHandler не обновляет соединение с 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 статуса с сообщением «Добро пожаловать в SockJS», порожденная TransportHandlingSockJsService вместо этого WebSocketHttpRequestHandler, который будет генерировать обновление AFAIK
@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() и начать любое подключение к сети. AFAIK - это обновление запроса.
Я могу выбрать принудительное обновление путем подключения к/ws/websocket (также не документирован). Итак, я не уверен, что лучше.
Любые предложения?
Я бы порекомендовал добавить документацию по этому вопросу. Для новичков это очень запутанно. – Marc