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连接时,请确保脚本使用变量启动连接.