Надежный способ получить IP-адрес клиента в одностороннем вызове метода CXF JAX-WS

Я использую следующий код для получения 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-адреса отправителя одностороннего вызова?

Ответ 1

вы можете использовать следующий фрагмент кода для поиска IP-адреса клиента

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

Ответ 2

Если ваша цель - установить соединение с веб-сервисом, возможно, WS-Addressing может быть полезно.

Альтернативные схемы адресации в стороне, HttpServletRequest.getRemoteAddr в сочетании с альтернативным IP-адресом getHeader должны быть правильными. Если это не так, то не много регресса (да, я могу представить себе различные изгибы, но принцип остается).

Итак, у вас есть последняя/самая стабильная версия вашей платформы? Это похоже на проблему с вашей платформой, о которой вы не указали никаких подробностей.