首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Boot 2 WebSockets连接意外丢失

Spring Boot 2 WebSockets连接意外丢失
EN

Stack Overflow用户
提问于 2020-09-21 15:48:04
回答 1查看 149关注 0票数 0

我有一个通过SockJS使用Websockets的Spring boot1.5+ Angular5应用程序,最近被迫升级到Springboot2.2。

升级后,我的websocket会在一段随机的时间后关闭,或者在写入websocket时关闭。当使用Spring Boot1.5时,一切都工作得很好。

下面是Spring中的配置,使用spring-boot-starter-websocket版本:'2.2.4.RELEASE‘

代码语言:javascript
复制
@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");
    }
}

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

代码语言:javascript
复制
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .antMatcher("/api/socket/**")
        .cors().and()
        .headers().frameOptions().disable().and()
        .csrf().disable()
        .authorizeRequests()
        .anyRequest().permitAll();
}

客户端代码:

代码语言:javascript
复制
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));
        });
    });
}

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

代码语言:javascript
复制
POST https://<url>/api/socket/231/i0rsgjlx/xhr?t=1600673163228 404
Whoops! Lost connection to https://<url>/api/socket

我经历了Websockets在Spring Boot2中无法工作的不同情况,似乎没有任何帮助。在1.5中,它工作得很好。这里我漏掉了什么?

EN

回答 1

Stack Overflow用户

发布于 2021-04-16 11:27:40

由于springboot2.0^不允许cors参数allowedOrigins = "*“,您可以覆盖AllowedOriginPatterns等于"*”

boot1.5 ->

代码语言:javascript
复制
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        StompWebSocketEndpointRegistration registration = registry.addEndpoint("/webSocket");
        registration.setAllowedOrigins("*");
        registration.withSockJS();
    }

boot2.0^->

代码语言:javascript
复制
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        StompWebSocketEndpointRegistration registration = registry.addEndpoint("/webSocket");
        // boot2.0^ AllowedOrigins = * is not allown
        registration.setAllowedOriginPatterns("*");
        registration.withSockJS();
    }

我和你有同样的错误,甚至搜索了很长时间,但是没有答案,所以我检查了调试日志,发现了这个问题,我用这种方法修复了它,它起作用了!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63988101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档