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" 请求,然后客户端开始尝试一次传输一个。