11

JAX-WSを使用してクライアントIPを取得しようとしていますが、次を使用しました。

@Resource
WebServiceContext wsContext; 

MessageContext mc = wsContext.getMessageContext();
HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST); 

log.info("["+req.getRemoteAddr()+"])

私は要求を受け取りますNullPointerException、mcはnullではありません。

HttpServletRequest私の質問は、Javaスタンドアロンアプリケーションを使用しているため、どのJARに使用するかです。

ありがとう

4

4 に答える 4

18

jax-wsサービスのWebサービスクライアントアドレスを取得する方法は、次のいずれかであるかどうかによって異なります。

  • Webサービスをサーブレットとして(Java EEコンテナで)実行する、または
  • Webサービスをスタンドアロンアプリケーション(Java SE 6または7)として実行します。

サーブレットWebサービスWebサービス がサーブレットの場合は、次の内容を含む最初の投稿のソリューションを使用してください。

HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST);

アプリケーションWebサービス:JAX-WS 2.1 Javaアプリケーション(Java SE)を使用している場合、サーブレットコンテキストがないため、HttpServletRequestはnullになります。後の投稿の方法を使用する必要があります。次の行があります。

HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE);

注:これは、JAX-WS2.1スタック/リファレンス実装でのみ機能します。

アプリケーションWebサービス:JAX-WS 2.2

JAX-WS 2.2では、の値がJAXWSProperties.HTTP_EXCHANGE「com.sun.xml.ws.http.exchange」(JAX-WS 2.1の値)から「com.sun.xml.internal.ws.http.exchange」に変更されました。 "。つまり、

HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE);
InetSocketAddress remoteAddress = exchange.getRemoteAddress();
String remoteHost = remoteAddress.getHostName();

JAX-WS 2.2ではnullが返さNullPointerExceptionれ、2行目にが表示されます。さらに重要なことに、クライアントのリモートアドレスを取得できません。

代わりに次の呼び出しを使用する場合(リテラル値を使用します、うーん!):

HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange");
InetSocketAddress remoteAddress = exchange.getRemoteAddress();
String remoteHost = remoteAddress.getHostName();

null以外の値を取得し、クライアントアドレスを取得できるようになります。

したがって、クライアントのリモートアドレスを取得する方法は、コード(サーブレットまたはアプリケーション)の展開方法と、使用しているJAX-WSのバージョン(JAX-WS 2.1または2.2)によって異なります。

推奨事項

  • サーブレット:JAX-WS Webサービスをサーブレットにデプロイしている場合は、使用しているMessageContext.SERVLET_REQUESTJAX-WS 2のバージョンに関係なく、いつでも呼び出しを使用してプロパティを取得できます。

  • アプリケーション:JAX-WS Webサービスをアプリケーションにデプロイする場合は、HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange");JAX-WS 2.1または2.2のどちらを使用していても、いつでも呼び出しを使用できます。したがって、コードでは、シンボリックではなく文字列リテラルを使用する方がよいでしょう。JAXWSProperties.HTTP_EXCHANGE

リテラルを使用するのと同じくらい不快ですが、JAX-WSバージョン間で機能するより堅牢なコードを使用する方が、機能しないよりきれいなコードよりも優れています。

JAX-WSチームがいつか問題を修正し、の値をJAXWSProperties.HTTP_EXCHANGE再び有用な値に復元することを願っています。

JAX-WSクライアントのリモートアドレスを見つけるさまざまな方法を示した以前のポスターに感謝します。情報はとても役に立ちました:)

于 2012-12-03T22:37:27.007 に答える
8

組み込みのHttpサーバーを使用する場合、次のようにクライアントIPを取得できます。

@Resource
WebServiceContext wsContext;

次に、Webメソッドで:

@WebMethod
MessageContext msgx = wsContext.getMessageContext();
HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE);
log.info("[" + exchange.getRemoteAddress().getAddress() + "]");

それが他の誰かに役立つことを願っています

于 2012-10-10T09:34:28.080 に答える
1

ここに答えがあります。WebMethod注釈付きメソッドでmcとreqを初期化する必要があると思います。 WebサービスのクライアントのIPアドレスを取得する

于 2012-10-04T13:20:18.460 に答える
-1

次のコードが機能する可能性があります。

HttpServletRequest request = (HttpServletRequest) messageContext.get("transport.http.servletRequest");
String hostIp = request.getRemoteAddr();
于 2015-05-21T08:43:27.707 に答える