3

Java の「JSR 356 - Java API for WebSocket」の Tyrus 参照実装を使用すると、Websocket のアップグレードに使用された HTTP 接続にアクセスする方法が見つかりません。したがって、ブラウザが送信した HTTP ヘッダーにアクセスできません。

HTTP UserAgent ヘッダーを読み取る方法はありますか?

「Session」オブジェクトを「TyrusSession」などにキャストすることは許容されますが、とにかくリモート アドレスを取得するにはそれを行う必要があります。Websocket 接続内のメッセージとして UserAgent を再度送信することは、私のフォールバック ソリューションです。

4

1 に答える 1

1

警告: ServerEndpointConfig はすべてのエンドポイント インスタンス間で共有され、複数のアップグレード リクエストを同時に実行できます。コメントを参照してください。

エンドポイントはコンフィギュレーターを取得します。

import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/foo", configurator = MyServerEndpointConfigurator.class)
public class MyEndpoint {

    @OnOpen
    public void onOpen(Session session, EndpointConfig endpointConfig) throws Exception {
        String ip = ((TyrusSession) session).getRemoteAddr();
        String userAgent = (String) endpointConfig.getUserProperties().get("user-agent");
        ...
   }
}

コンフィギュレーターは次のようになります。

import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;

public class MyServerEndpointConfigurator extends ServerEndpointConfig.Configurator {

    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        if (request.getHeaders().containsKey("user-agent")) {
            sec.getUserProperties().put("user-agent", request.getHeaders().get("user-agent").get(0)); // lower-case!
        }
    }
}
于 2015-03-10T17:26:43.987 に答える