2012-07-26 54 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