jax ws получает ip клиента
Я пытаюсь получить клиентский IP с помощью JAX-WS, я использовал:
@Resource
WebServiceContext wsContext;
MessageContext mc = wsContext.getMessageContext();
HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
log.info("["+req.getRemoteAddr()+"])
Я получаю NullPointerException
в запросе mc не является нулевым.
У меня вопрос, какой JAR использовать для HttpServletRequest
потому что я использую автономное приложение Java?
Спасибо
4 ответа
Как получить адрес клиента веб-службы для службы jax-ws, зависит от того, являетесь ли вы:
- Запуск вашего веб-сервиса в качестве сервлета (в контейнере Java EE) или
- Запуск вашего веб-сервиса в качестве автономного приложения (Java SE 6 или 7).
Веб-сервисы сервлетов Если ваш веб-сервис является сервлетом, используйте решение первого поста, содержащее следующее:
HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
Веб-сервисы приложений: JAX-WS 2.1 Если вы используете приложение Java (Java SE), у вас нет контекста сервлета, поэтому HttpServletRequest
будет нулевым Вам нужно использовать метод из следующего поста, который имеет следующую строку:
HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE);
Примечание: это работает только с реализацией стека / эталона JAX-WS 2.1.
Веб-сервисы приложений: 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, и вы получите NullPointerException
во второй строке, и что более важно, не удается получить удаленный адрес клиента.
Если вместо этого вы используете следующий вызов (используя буквальное значение, тьфу!):
HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange");
InetSocketAddress remoteAddress = exchange.getRemoteAddress();
String remoteHost = remoteAddress.getHostName();
вы получите ненулевое значение и сможете получить адрес клиента.
Таким образом, способ получения удаленного адреса клиента зависит от того, как вы развернете свой код (сервлет или приложение) и какую версию JAX-WS вы используете (JAX-WS 2.1 или 2.2).
рекомендации
Сервлеты: если вы развертываете свой веб-сервис JAX-WS в сервлете, вы всегда можете использовать вызов для получения свойства
MessageContext.SERVLET_REQUEST
независимо от того, какую версию JAX-WS 2 вы используете.Приложения: если вы развертываете свой веб-сервис JAX-WS в приложении, вы всегда можете использовать вызов
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. Информация была очень полезной:)
Если мы используем встроенный Http-сервер, мы можем получить IP-адрес клиента следующим образом:
@Resource
WebServiceContext wsContext;
Тогда в веб-методе:
@WebMethod
MessageContext msgx = wsContext.getMessageContext();
HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE);
log.info("["+exchange.getRemoteAddress().getAddress()+"])
Надеюсь, это поможет кому-то еще
Вот ответ, я думаю, вы должны инициализировать mc и req в аннотированном методе WebMethod. Получение IP-адреса клиента для веб-службы
Следующий код может работать:
HttpServletRequest request = (HttpServletRequest) messageContext.get("transport.http.servletRequest");
String hostIp = request.getRemoteAddr();