2012-10-04 130 views
9

我試圖檢索與JAX-WS的客戶端IP,我用:JAX WS獲得客戶端IP

@Resource 
WebServiceContext wsContext; 

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

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

我REQ得到了NullPointerException,MC是不爲空。

我的問題是哪個JAR用於HttpServletRequest,因爲我正在使用Java獨立應用程序?

感謝

回答

15

如何獲取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客戶端遠程地址的各種方法。這些信息是非常有用的:)

+0

值得注意的是,對於HTTPS連接,沒有與關鍵字「com.sun.xml.ws.http.exchange」關聯的值。但是對於字符串文字「com.sun.xml.internal.ws.http.exchange」,你可以得到一個對象並將其轉換爲'HttpsExchange'。使用JAX-WS 2.2測試(官方)Java 7。 –

1

這裏是一個答案,我想你應該在初始化的WebMethod註釋的方法MC和REQ。 Geting the IP Address Of A client For a webservice

+0

這就是我所做的,問題是即時通訊使用嵌入式HTTP服務器,所以: HttpServletRequest的REQ =(HttpServletRequest的)mc.get( MessageContext.SERVLET_REQUEST); 是不正確的,這就是我尋找。 無論如何感謝 – bazic

6

如果我們用一個嵌入式HTTP服務器,我們可以得到客戶端IP是這樣的:

@Resource 
WebServiceContext wsContext; 

然後在Web方法:

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

希望它可以幫助別人

-1

下面的代碼可能工作:

HttpServletRequest request = (HttpServletRequest) messageContext.get("transport.http.servletRequest"); 
String hostIp = request.getRemoteAddr(); 
+0

如果您想獲取HttpServletRequest的實例,請使用「MessageContext.SERVLET_REQUEST」作爲關鍵字 –