Spring Boot 2 WebSockets连接意外丢失

问题描述

我有一个通过SockJS使用Websockets的Spring boot 1.5 + Angular5应用程序,最近被迫升级到Spring boot 2.2。

升级后,我的websocket在一段随机的时间后或写入websocket时被关闭。使用Spring Boot 1.5时,一切正常。

以下是Spring中的配置,使用spring-boot-starter-websocket版本:“ 2.2.4.RELEASE”

@Configuration
@EnableWebSocketMessagebroker
public class WebSocketConfiguration extends AbstractWebSocketMessagebrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/api/socket")
            .setAllowedOrigins("*")
            .withSockJS();
    }

    @Override
    public void configureMessagebroker(MessagebrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app")
            .enableSimplebroker("/nightly");
    }
}

我还添加了以下安全规则:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .antMatcher("/api/socket/**")
        .cors().and()
        .headers().frameOptions().disable().and()
        .csrf().disable()
        .authorizeRequests()
        .anyRequest().permitAll();
}

客户代码

initWebSocket() {
    const ws = new SockJS('/api/socket');
    this.stompClient = Stomp.over(ws);
    const that = this;
    this.stompClient.connect({},() => {
        that.stompClient.subscribe('/nightly',(message) => {
            this._rootStore.dispatch(new UpdateNightlyAction(message));
        });
    });
}

当连接断开时,客户端记录以下内容

POST https://<url>/api/socket/231/i0rsgjlx/xhr?t=1600673163228 404
Whoops! Lost connection to https://<url>/api/socket

我经历了Websockets的不同场景,这些场景在Spring Boot 2中不起作用,似乎没有任何帮助。在1.5中,它可以正常工作。我在这里想念什么?

解决方法

因为 springboot2.0^ is not allowed cors param allowedOrigins = "*" ,你可以覆盖 AllowedOriginPatterns equals "*"

boot1.5 ->

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        StompWebSocketEndpointRegistration registration = registry.addEndpoint("/webSocket");
        registration.setAllowedOrigins("*");
        registration.withSockJS();
    }

boot2.0^->

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        StompWebSocketEndpointRegistration registration = registry.addEndpoint("/webSocket");
        // boot2.0^ AllowedOrigins = * is not allown
        registration.setAllowedOriginPatterns("*");
        registration.withSockJS();
    }

我和你的错误一样,找了半天也没找到 答案,所以我检查调试日志发现了这个问题,我用这个方法修复了它,它有效!