2012-07-26 20 views
10

我用下面的代碼獲取客戶端IP地址爲JAX-WS單向方法調用:可靠的方式在CXF的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地址的可靠方法是什麼?

回答

18

你可以使用如下代碼片段來找到客戶端IP

Message message = PhaseInterceptorChain.getCurrentMessage(); 
HttpServletRequest request = (HttpServletRequest)message.get(AbstractHTTPDestination.HTTP_REQUEST); 
request.getRemoteAddr() 
1

如果您的目的是建立一個網絡服務連接,那麼WS-Addressing可能會有所幫助。

撇開替代尋址方案, HttpServletRequest.getRemoteAddr結合getHeader替代IP地址指定爲正確。 如果他們不是那麼沒有太多的追索 (是的,我可以想象各種扭曲,但原則依然存在)。

那麼,你有最新/最穩定的平臺版本嗎?這聽起來更像是你的平臺的問題 - 你沒有提供任何細節。

+0

我會仔細看一下WS-Addressing的,如果它可以提供幫助。 我正在使用在tomcat-6.0.35上運行的cxf-2.5.2。 – amo 2012-07-31 00:14:53