可靠的方式来获得CXF的JAX-WS单向方法调用客户端的IP地址(Reliable way to g

2019-07-30 15:15发布

我使用下面的代码获取客户端IP地址为JAX-WS单向方法调用:

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地址?

Answer 1:

你可以使用如下代码片段来找到客户端IP

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


Answer 2:

如果你的目的是要建立一个Web服务连接那时也许WS-Addressing的可能会有所帮助。

替代寻址方案不谈, HttpServletRequest.getRemoteAddr与组合getHeader替代IP地址只具备是正确的。 如果他们不那么有没有什么追索权(是的,我能想象的各种扭曲,但原理)。

所以,你有你的平台的最新/最稳定的版本? 这听起来更像是你的平台的问题 - 它的你没有提供任何细节。



文章来源: Reliable way to get client IP address in CXF JAX-WS one-way method call