为何应用初始化与运行时动态注册WebSocket的暴露端点不一致
WebSocket两种注册场景路径差异原因
核心触发原因
两种注册流程触发了Spring WebSocket不同的路径处理逻辑:
- 初始化阶段
PostConstruct执行的注册逻辑,会经过SpringServletWebSocketHandlerRegistry的默认后处理:默认开启SockJS兼容支持时,框架会自动给所有注册端点追加SockJS路径规则,其中/websocket是SockJS协议规定的原生WebSocket传输固定子路径,所以你注册的/sampleEndpoint实际暴露的原生WebSocket路径是/sampleEndpoint/websocket。 - 运行时动态调用
ServerWebSocketContainer的注册方法时,已经过了Spring上下文初始化的端点后处理阶段,SockJS的路径追加规则不会再生效,注册的路径会直接作为原生WebSocket的暴露地址,不需要额外加后缀。
统一路径的解决方案
如果需要两种场景下路径一致,可以在初始化注册时显式关闭SockJS支持:
// 方式1:不启用SockJS,直接注册原生端点 registry.addEndpoint("/sampleEndpoint") .setAllowedOrigins("*"); // 方式2:启用SockJS但只允许原生WebSocket传输 registry.addEndpoint("/sampleEndpoint") .setAllowedOrigins("*") .withSockJS() .setTransportHandlerOverrides(new WebSocketTransportHandler(new DefaultHandshakeHandler()));
内容的提问来源于stack exchange,提问作者pjsagar
相关产品推荐
相关产品推荐

