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