Websocket API for Java GlassfishでリモートピアのIPアドレスを取得するにはどうすればよいですか?
3 に答える
別の質問に対するこの回答に基づく別の方法は、HandshakeRequest のヘッダーを取得することです。探しているヘッダーは、次のいずれかです。
origin: [IP Address]
x-forwarded-for: [Possibly a separate IP]
わかりやすくするために、ここに私のセットアップと、これをどのように発見したかを示します。
- MyMachine:6060 の Wamp 2.5。これは、クライアントの HTML ページをホストします。
- LabMachine:6060 (通常の接続) および LabMachine:6443 (安全な接続) の Wamp 2.5。これはプロキシとして機能します。
- MyMachine:8080 (通常) および MyMachine:8181 (SSL) 上の GlassFish 4.0。これがエンドポイントです。
私は自分のマシン、ラボのマシン、同僚のマシンを介してクライアント ページに接続しました。いずれの場合も、WebSocket リクエストのオリジン ヘッダーは
ただし、各ケースでx-forwarded-hostヘッダーは異なり、実際のクライアントの IP アドレスと一致していました。
getRemoteAddr()を参照してください
標準の JSR-356 セッション インターフェイスを実装する TyrusSession に、ソケット セッション インスタンスをキャストする必要があります。
お使いのバージョンがこの方法をサポートしているかどうかわからないため、Tyrus をアップグレードする必要があるかもしれません。Tyrus 1.7を使用していますが、問題なく動作します。アップグレードの方法は次のとおりです。
WebSockets
HTTP リクエストに基づいています。HttpServlet
したがって、おそらく anまたは a をどこかに拡張しているWebSocketServlet
ので、 から IP を取得する通常の方法が機能するHttpServletRequest
はずです。
例:
public class WebSocketsServlet extends HttpServlet {
private final WebSocketApplication app = new WebSocketApplication();
@Override
public void init(ServletConfig config) throws ServletException {
WebSocketEngine.getEngine().register(
config.getServletContext().getContextPath() + "/context", app);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("IP: " + req.getRemoteAddr());
super.doGet(req, resp);
}
}