2016-08-16 6 views
7

Dies ist ein ziemlich häufiges Problem, aber ich kann keine Lösung für meinen speziellen Fall finden. Ich verwende Glassfish 4.1.1 und meine Anwendung implementiert Websockets.WebSockets nicht hinter Proxy angeschlossen

Auf einer Client-Seite zu WS-Server einfach durch Ich verbinde:

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

Auf einem Server-Seite WebSockets über @ServerEndpoint Funktionalität implementiert und sieht sehr häufig:

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

    @OnOpen 
    public void open(final Session session, @PathParam("token") final String token) { ... } 
etc. 
} 

Alles funktioniert bis zu dem Moment, wenn der Kunde versucht, sich hinter dem Proxy zu verbinden. Mit diesem Test: http://websocketstest.com/ Ich habe festgestellt, dass Computer des Kunden hinter http-Proxy 1.1 funktioniert. Er kann keine Verbindung zu Websockets herstellen, onopen einfach gar nicht. wsoscket.readyState wird niemals 1.

Wie kann ich meinen ServerEndpoint so einstellen, dass dieser Code auch dann funktioniert, wenn der Kunde eine Verbindung hinter dem Proxy herstellt?

Vielen Dank im Voraus!

UPDATE: Ich würde auf diesem Computer einen Screenshot mit websocketstest bieten: enter image description here

Auf meinem Computer scheint es ähnlich, außer einem: HTTP-Proxy: NEIN.

+0

Hope [this link] (http://stackoverflow.com/questions/29430503/java-websocket-with-proxy) hilft Ihnen – Sanjeev

+1

Ich möchte nicht der Träger von schlechten Nachrichten sein, aber aller Wahrscheinlichkeit nach es ist der Proxy-Server selbst, der Websockets nicht richtig unterstützt. Sie können das nicht weg programmieren, außer mit einem Fallback-Mechanismus zum Polling wie Socket.IO bietet. – Gimby

+0

Gimby, danke für deine Antwort, aber http://websocketstest.com/ zeigte, dass der Handshake (und der Echotest) über den ssl 443 Port erfolgreich war. Also denke ich, dass Websockets mit diesem Proxy-Server arbeiten können. – Luxor

Antwort

9

Wie die Kommentare zu den Fragen angeben, scheint der Proxy Websockets nicht richtig zu unterstützen.

Dies ist ein häufiges Problem (einige Handy-Unternehmen haben Proxies, die Websocket-Verbindungen stören) und die Lösung besteht darin, TLS/SSL-Verbindungen zu verwenden.

Das Problem tritt hauptsächlich auf, weil einige Proxys die Websocket-Request-Header "korrigieren" (lesen: korrupt).

Bei Verwendung von TLS/SSL können die Proxys jedoch die Header-Daten (die verschlüsselt sind) nicht lesen, wodurch bei den meisten Proxys Daten "weitergeleitet" werden.

Das bedeutet, die Header werden sicher am anderen Ende ankommen und der Proxy wird (meistens) die Verbindung ignorieren ... Dies kann immer noch ein Problem verursachen, wo Verbindungstimeouts betroffen sind, aber es löst das Problem normalerweise.

EDIT

Beachten Sie, dass der Browser des Clients aus dem Mischen nicht verschlüsselten Inhalt mit verschlüsselten Inhalten schützen. Stellen Sie sicher, dass das Skript die ws-Verbindungen mit der wss-Variante initiiert, wenn TLS/SSL-Verbindungen verwendet werden.

+1

Danke! Wir werden es versuchen! – Luxor

+0

@Luxor hatte Erfolg? – Gimby

+0

@ Gimby, ja! Jetzt funktioniert es über https/ssl (mit wss-Protokoll). Vielen Dank an Myst! Ich habe auch die Antwort als die beste markiert! – Luxor