2016-06-13 5 views
2

Несмотря на то, что это не описано в документации 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 (также не документирован). Итак, я не уверен, что лучше.

Любые предложения?

ответ

1

Ожидаемое поведение. Как работает протокол SockJS: http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html. Существует первоначальный запрос «приветствия», после чего клиент начинает пытаться транспортировать по одному за раз.

+0

Я бы порекомендовал добавить документацию по этому вопросу. Для новичков это очень запутанно. – Marc