我正在标准网页和 Tomcat v7.0.62 服务器之间设置 WebSocket。在 Firefox、Edge 和 IE11 上打开/关闭 Tomcat SSL 时,连接工作正常。但是,在 Chrome (v66.03) 中,仅当我在服务器上打开 SSL 并通过 https 连接时,websocket 才会连接。在 Chrome 中,当我在服务器上关闭 SSL 并尝试通过 http 连接时,它会抛出错误。
这是在 Tomcat 上关闭 SSL 的情况下尝试通过 http 连接时 Chrome 抛出的错误...
Error in connection establishment: net::ERR_PROXY_AUTH_REQUESTED_WITH_NO_CONNECTION
这是我在客户端上的 WebSocket 连接代码...
var wss = "wss://";
if (document.location.protocol === "http:") {
wss = "ws://";
}
var wsURL = wss + document.location.host + "/status?sessionId=<%=session.getId()%>";
这是 Chrome 特有的东西,需要在非 https websocket 连接上使用特殊代码吗?
这是 Chrome 特定的行为。 Chrome 不允许不安全的 Websocket (ws) 连接到本地主机(仅限 wss,因此您应该为本地 Web/Websocket 服务器设置 TLS 证书)。但在 Firefox 和其他浏览器中应该可以正常工作,不会出现任何问题。
有关此问题,请参阅 Chromium 上的 Chrome 错误报告。这个特殊问题是有意为之的,他们做出了这个改变是为了 Chrome 通过防止针对内部网络设备和在本地主机上侦听的进程的攻击来提高安全性。
https://bugs.chromium.org/p/chromium/issues/detail?id=378566
Error in connection establishment: net::ERR_PROXY_AUTH_REQUESTED_WITH_NO_CONNECTION
您可能在客户端和服务之间有一个带有身份验证的代理。根据代理和客户端配置,它可能允许通过 SSL 连接,但纯 http 将被过滤。
我无法确认您的问题。您可以在这里尝试 Echo 测试:http://www.websocket.org/echo.html
网站支持http和https,您可以指定
ws://echo.websocket.org
和wss://echo.websocket.org
。我已经尝试了所有组合,它们都对我有用。
我的猜测是您的服务器的配置问题或浏览器扩展的问题。
如果您使用 Java 服务,要允许 WS 在 chrome 上运行,需要 setAllowedOrigins 到 setWebSocketHandlerRegistry 以获得所需的源或 * 以保持其打开状态
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new SocketTextHandler(), "/<end-point>").setAllowedOrigins("<my-origin>");
}
无需 wss。