无法与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('连接成功'); };
额外检查点
- 跨域配置:WebSocket端点的跨域已通过
setAllowedOriginPatterns("*")处理,和你配置的CorsConfig不冲突。如果需要更严格的跨域限制,可将setAllowedOriginPatterns("*")改为setAllowedOrigins("http://localhost:3000")。 - 服务器状态:确认Spring Boot应用已正常启动,端口8080未被占用。
内容的提问来源于stack exchange,提问作者cam
相关产品推荐
相关产品推荐

