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

无法与Spring Boot服务器建立WebSocket连接(错误:400 Bad Request)

解决WebSocket连接400错误的方案

核心问题原因

你的Spring Boot WebSocket配置中使用了.withSockJS(),这会让端点仅支持SockJS协议的握手流程,而原生WebSocket客户端(比如wscat、浏览器原生WebSocket对象)发送的是标准WebSocket握手请求,和SockJS的要求不匹配,因此服务器返回400错误。

解决方案

方案1:使用SockJS客户端连接

如果需要保留SockJS的降级能力(兼容不支持WebSocket的旧浏览器),客户端必须使用SockJS库发起连接,配合STOMP协议使用。示例前端代码:

// 引入SockJS和STOMP库(可通过CDN或本地引入)
<script src="https://cdn.jsdelivr.net/npm/sockjs-client@1/dist/sockjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@stomp/stompjs@7/bundles/stomp.umd.min.js"></script>

<script>
  const socket = new SockJS('http://localhost:8080/ws');
  const stompClient = Stomp.over(socket);

  stompClient.connect({}, function(frame) {
    console.log('连接成功: ' + frame);
    // 订阅主题示例
    stompClient.subscribe('/topic/test', function(message) {
      console.log('收到消息: ' + message.body);
    });
  }, function(error) {
    console.error('连接失败: ' + error);
  });
</script>

方案2:移除SockJS配置(仅支持原生WebSocket)

如果无需兼容旧浏览器,可以直接去掉SockJS配置,让端点支持标准WebSocket连接。修改WebSocketConfig的registerStompEndpoints方法:

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/ws").setAllowedOriginPatterns("*");
    // 移除.withSockJS()
}

修改后,即可用原生WebSocket工具连接:

  • 用wscat命令:wscat -c ws://localhost:8080/ws
  • 浏览器原生代码:
const socket = new WebSocket('ws://localhost:8080/ws');
socket.onopen = function() {
  console.log('连接成功');
};

额外检查点

  1. 跨域配置:WebSocket端点的跨域已通过setAllowedOriginPatterns("*")处理,和你配置的CorsConfig不冲突。如果需要更严格的跨域限制,可将setAllowedOriginPatterns("*")改为setAllowedOrigins("http://localhost:3000")。
  2. 服务器状态:确认Spring Boot应用已正常启动,端口8080未被占用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:25:16