WebSocket客户端无法跨端口连接Java Spring WebSocket服务器求助
问题原因
WebSocket本身不强制要求客户端与服务器同端口/同域,你遇到的连接失败是浏览器的同源策略限制导致的。localhost:8080和localhost:3000属于不同源(端口不同),浏览器会拦截跨域的WebSocket握手请求,进而导致连接失败。
解决方案
在Spring WebSocket的配置中显式添加跨域允许规则即可解决问题,修改你的WebSocketConfig类:
// WebSocketConfig.java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Autowired SocketTextHandler socketTextHandler; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(socketTextHandler, "/sockets") // 允许指定跨域源,可传入多个参数 .setAllowedOrigins("http://localhost:3000"); // 如果需要允许所有源,可替换为 .setAllowedOrigins("*") } }
补充说明
- 同端口下客户端与服务端属于同源,浏览器不会触发跨域拦截,因此能正常连接;
setAllowedOrigins方法可以指定单个或多个允许的跨域源,生产环境不建议直接用"*",应指定具体可信域名;- 配置后,localhost:3000的客户端发起WebSocket连接时,服务器会在握手响应中添加跨域允许的Header,浏览器就不会拦截请求了。
内容的提问来源于stack exchange,提问作者thusimon
相关产品推荐
相关产品推荐

