You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot集成WebSocket对接JS前端出现CORS跨域错误如何解决

SpringBoot WebSocket STOMP 跨域CORS错误解决方案

以下是需要逐一修正的问题点及修改代码:

1. 修正WebSocket端点跨域配置

SpringBoot 2.4及以上版本中,setAllowedOrigins("*") 与 withSockJS() 搭配使用时会失效,需替换为setAllowedOriginPatterns("*"):

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry){
        registry.addEndpoint("/stomp-endpoint")
                // 替换原有setAllowedOrigins("*")
                .setAllowedOriginPatterns("*")
                .withSockJS();
    }

    // 其余配置待修正
}

注:控制器上的@CrossOrigin注解对WebSocket STOMP握手请求无效,无需额外配置。

2. 统一消息代理前缀配置

你当前配置的消息代理前缀为/topics,但@SendTo注解使用的路径前缀是/topic,两边不匹配会导致消息无法正常推送,需修改为一致前缀:

@Override
public void configureMessageBroker(MessageBrokerRegistry registry){
    // 改为和@SendTo匹配的/topic前缀
    registry.enableSimpleBroker("/topic");
    registry.setApplicationDestinationPrefixes("/app");
}

3. 修正前端代码错误

你的前端代码存在两处错误:连接地址多了多余斜杠、订阅地址不需要加完整域名前缀,修改后代码如下:

function connect() {
    // 去掉多余的斜杠,修正连接地址
    var socket = new SockJS('http://localhost:8080/stomp-endpoint');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        // 订阅地址直接写主题路径,不需要加域名前缀
        stompClient.subscribe('/topic/greetings', function (greeting) {
            showGreeting(JSON.parse(greeting.body));
        });
    });
}

额外排查项

如果你的项目集成了Spring Security,需要在安全配置中放行/stomp-endpoint以及对应的SockJS子路径,避免权限拦截导致的连接失败。

内容的提问来源于stack exchange,提问作者Amara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:15:02