如何獲取jax-ws服務的web服務客戶端地址取決於您是否:
- 運行你的web服務作爲一個servlet(在Java EE容器),或
- 運行你的web服務作爲一個獨立的應用程序(的Java SE 6或7)。
Servlet的Web服務 如果你的Web服務是一個servlet然後使用第一個帖子,包含以下解決方案:
HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
應用Web服務:JAX-WS 2.1 如果你是使用Java應用程序(Java SE),您沒有servlet上下文,因此HttpServletRequest
將爲空。您需要使用以後的文章中的方法,具有以下行之一:
HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE);
注:這隻能與JAX-WS 2.1棧/參考實現。
應用WEBSERVICES: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
,更重要的是,無法獲得客戶端的遠程地址。
如果你使用下面的調用來代替(使用字面值,唉!):
HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange");
InetSocketAddress remoteAddress = exchange.getRemoteAddress();
String remoteHost = remoteAddress.getHostName();
您將得到一個非空值並且將能夠獲取客戶端地址。因此,如何獲取客戶端的遠程地址取決於您如何部署代碼(servlet或應用程序)以及您正在使用哪個版本的JAX-WS(JAX-WS 2.1或2.2)。
建議
Servlet的:如果你是在一個servlet在部署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客戶端遠程地址的各種方法。這些信息是非常有用的:)
來源
2012-12-03 22:37:27
Moa
值得注意的是,對於HTTPS連接,沒有與關鍵字「com.sun.xml.ws.http.exchange」關聯的值。但是對於字符串文字「com.sun.xml.internal.ws.http.exchange」,你可以得到一個對象並將其轉換爲'HttpsExchange'。使用JAX-WS 2.2測試(官方)Java 7。 –