12

次のコードを使用して、JAX-WS の一方向メソッド呼び出しのクライアント IP アドレスを取得しています。

protected HttpServletRequest getServletRequest() {
    MessageContext ctx = wsContext.getMessageContext();
    return (HttpServletRequest) ctx.get( MessageContext.SERVLET_REQUEST );
}

protected synchronized String getClientIp() {
    String clientIp = "";
    HttpServletRequest request = getServletRequest();
    if ( request != null ) {
        clientIp = request.getRemoteAddr();

        // Handle proxy
        String header = request.getHeader( "x-forwarded-for" );
        if( header != null && !header.isEmpty() ) {
            clientIp = header.split( "," )[0];
        }
    }
    return clientIp;
}

複数のクライアントが接続している場合、リクエストに対して取得された IP アドレスが、以前のリクエストでキャッシュされた誤った値である場合があります。一方向通話発信者の IP アドレスを取得する信頼できる方法は何ですか?

4

2 に答える 2

22

次のコード スニペットを使用して、クライアント IP を見つけることができます

Message message = PhaseInterceptorChain.getCurrentMessage();
HttpServletRequest request = (HttpServletRequest)message.get(AbstractHTTPDestination.HTTP_REQUEST);
request.getRemoteAddr()
于 2012-09-20T21:42:09.990 に答える
1

目的が Web サービス接続を確立することである場合は、おそらくWS-Addressingが役立つ可能性があります。

HttpServletRequest.getRemoteAddr代替 IP アドレスと組み合わせた代替アドレス指定スキームは、 getHeader正しいと仕様されています。そうでない場合は、あまり頼りになりません (そうです、さまざまなゆがみを想像できますが、原則は変わりません)。

プラットフォームの最新/最高の安定版リリースはありますか? プラットフォームの問題のように聞こえますが、詳細は提供されていません。

于 2012-07-30T21:34:53.617 に答える