web-dev-qa-db-ja.com

プロキシの背後に接続されていないWebSocket

これはかなり一般的な問題ですが、私の特定のケースに対する解決策を見つけることができません。 Glassfish 4.1.1を使用していますが、アプリケーションにはWebSocketが実装されています。

クライアント側では、単に次の方法でWS-serverに接続しています。

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

サーバー側では、WebSocketは@ServerEndpoint機能を介して実装され、非常に一般的に見えます。

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

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

顧客がプロキシの背後で接続しようとする瞬間まで、すべてが正常に機能します。このテストの使用: http://websocketstest.com/ お客様のコンピューターがhttp-proxy 1.1の背後で動作していることがわかりました。彼はWebSocketに接続できず、onopenはまったく起動しません。 wsoscket.readyStateが1になることはありません。

顧客がプロキシの背後で接続している場合でも、このコードが機能するようにServerEndpointを調整するにはどうすればよいですか?

前もって感謝します!

更新:私はそのコンピューターでwebsocketstestのスクリーンショットを提供します: enter image description here

私のコンピューターでは、HTTPプロキシ:いいえという1つの点を除いて、同じように見えます。

11
Luxor

質問へのコメントのように、プロキシはWebSocketを適切にサポートしていないようです。

これは一般的な問題であり(一部の携帯電話会社では、WebSocket接続を中断するプロキシがあります)、解決策はTLS/SSL接続を使用することです。

この問題は主に、一部のプロキシがWebsocketリクエストヘッダーを「修正」(読み取り:破損)しているために発生します。

ただし、TLS/SSLを使用する場合、プロキシはヘッダーデータ(暗号化されている)を読み取ることができないため、ほとんどのプロキシでデータが「パススルー」します。

これは、ヘッダーがもう一方の端に安全に到着し、プロキシが(ほとんど)接続を無視することを意味します。これにより、接続タイムアウトに関する問題が発生する可能性がありますが、通常は問題が解決します。

[〜#〜]編集[〜#〜]

ブラウザは、クライアントを保護して、暗号化されていないコンテンツと暗号化されていないコンテンツが混在しないようにします。 TLS/SSL接続が使用されている場合、スクリプトがwsバリアントを使用してwss接続を開始することを確認してください。

18
Myst