为什么 SockJS 代理故障可能只在回退后才出现
WebSocket 路径与 XHR 回退可能使用不同的 HTTP 客户端。在更改其代理设置之前,先确定是哪种传输在失败。
当 WebSocket 在一个网络上正常工作、而 SockJS 在另一个网络上失败时,第二个网络可能触发了 XHR 回退。这会改变发出请求的 HTTP 实现——因此也会改变所使用的代理配置。
找出第一个失败的 URL 及其选定的传输方式。SockJS 可能在选择传输方式之前先发出一个 HTTP 信息请求;WebSocket 握手与后续的轮询请求是彼此独立的操作。握手配置正常工作,并不能证明两者各自使用的路径。
在 Spring 的 Java 客户端中,RestTemplateXhrTransport 接受一个已配置的 RestTemplate。它的请求工厂和底层 HTTP 客户端提供了回退所支持的代理路由与认证。对于使用 HttpClient 5 的 Spring 6,请配置该 RestTemplate 实际使用的请求工厂。如果该实现使用 Apache HTTP 组件,其代际必须与集成方式相匹配。
WebSocket 客户端有其自己文档化的连接设置。JVM 代理属性只有在具体客户端读取它们时才会影响某条路径。按传输方式、客户端实现、所选代理和首个错误来比较正常与失败的环境。如果只有 XHR 失败,应沿着它的路由、认证和长时挂起的响应去排查,而不是反复更改正常工作的 WebSocket 客户端设置。