未在代理后面连接的Websockets

Lux*_*xor 9 javascript java proxy glassfish websocket

这是一个很常见的问题,但我无法找到解决我具体案例的方法.我正在使用Glassfish 4.1.1,我的应用程序实现了Websockets.

在客户端,我只是通过以下方式连接到WS-server:

var serviceLocation = "ws://" + window.location.host + window.location.pathname + "dialog/";
var wsocket = new WebSocket(serviceLocation + token_var);
Run Code Online (Sandbox Code Playgroud)

在服务器端,websockets通过@ServerEndpoint功能实现,看起来很常见:

@ServerEndpoint(value = "/dialog/{token}", decoders = DialogMessageDecoder.class)
public class DialogWebsoketEndpoint {

    @OnOpen
    public void open(final Session session, @PathParam("token") final String token) { ... }
etc.
}
Run Code Online (Sandbox Code Playgroud)

一切正常,直到客户试图连接代理后面的那一刻.使用此测试:http://websocketstest.com/我发现客户的计算机在http-proxy 1.1后面工作.他无法连接到websockets,onopen根本就不会开火.wsoscket.readyState永远不会成为1.

即使客户在代理后面连接,我如何调整我的ServerEndpoint以使此代码工作?

先感谢您!

更新:我会在该计算机上提供websocketstest的屏幕截图:在此输入图像描述

在我的计算机上似乎除了一件事之外:HTTP代理:否.

Mys*_*yst 17

就问题的评论而言,似乎Proxy不能正确支持Websockets.

这是一个常见问题(一些手机公司的代理会破坏websocket连接),解决方案是使用TLS/SSL连接.

问题出现主要是因为一些代理"正确"(读取:损坏)Websocket请求标头.

但是,当使用TLS/SSL时,代理无法读取标头数据(加密),从而导致数据在大多数代理上"传递".

这意味着标头将安全地到达另一端,代理将(大部分)忽略连接...这可能仍会导致连接超时问题,但它通常可以解决问题.

编辑

请注意,浏览器将保护客户端不将非加密内容与加密内容混合.ws使用wssTLS/SSL连接时,请确保脚本使用变量启动连接.