2012-10-04 14 views
9

Próbuję pobrać IP klienta z JAX-WS, użyłem:JAX WS uzyskiwanie IP klienta

@Resource 
WebServiceContext wsContext; 

MessageContext mc = wsContext.getMessageContext(); 
HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST); 

log.info("["+req.getRemoteAddr()+"]) 

dostaję NullPointerException w req, mc nie jest null.

Moje pytanie brzmi, który JAR używać do HttpServletRequest, ponieważ używam autonomicznej aplikacji Java?

Dzięki

Odpowiedz

15

Sposób uzyskania adresu klienta usługi web dla usługi jax-ws zależy od tego, czy:

  • Prowadzenie usługa jako serwletu (w pojemniku Java EE) lub
  • Prowadzenie usługa jako samodzielna aplikacja (Java SE 6 lub 7).

Servlet sieciowe Jeśli usługa jest aplet następnie użyć roztworu pierwszego posta, który zawiera następujące elementy:

HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST); 

Application sieciowe: JAX-WS 2.1 Jeżeli jesteś za pomocą aplikacji Java (Java SE) nie masz kontekstu serwletu, więc HttpServletRequest będzie mieć wartość null. Trzeba zastosować metodę późniejszym poście, ten, który ma następującą linię:

HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE); 

Uwaga: To działa tylko z wdrażaniem 2,1 stos/odniesienia JAX-WS.

aplikacji sieciowe: JAX-WS 2.2

W JAX-WS 2.2 wartość JAXWSProperties.HTTP_EXCHANGE zmienił się z "com.sun.xml.ws.http.exchange" (wartość to było w JAX- WS 2.1) do "com.sun.xml.internal.ws.http.exchange". Oznacza to, że wezwanie do

HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE); 
InetSocketAddress remoteAddress = exchange.getRemoteAddress(); 
String remoteHost = remoteAddress.getHostName(); 

zwróci wartość null w JAX-WS 2.2 i dostaniesz NullPointerException w drugiej linii, a co ważniejsze, nie można uzyskać zdalny adres klienta.

Jeśli zamiast tego używasz następującego połączenia (używając wartości literowej, ugh!):

HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange"); 
InetSocketAddress remoteAddress = exchange.getRemoteAddress(); 
String remoteHost = remoteAddress.getHostName(); 

otrzymasz wartość inną niż null i będzie można uzyskać adres klienta.

Sposób uzyskania zdalnego adresu klienta zależy od sposobu wdrożenia kodu (serwletu lub aplikacji) i używanej wersji JAX-WS (JAX-WS 2.1 lub 2.2).

Zalecenia

  • Servlety: W przypadku wdrażania swoją usługa JAX-WS w serwletu zawsze można skorzystać z połączenia w celu uzyskania własności MessageContext.SERVLET_REQUEST bez względu na to, jaka wersja JAX-WS 2 ty używasz.

  • Aplikacje: W przypadku wdrażania swoją usługa JAX-WS w aplikacji zawsze można użyć połączenia HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange"); bez względu na to, czy używasz JAX-WS 2.1 lub 2.2, więc to chyba lepiej użyć ciąg dosłownie w kodzie, a nie symboliczny JAXWSProperties.HTTP_EXCHANGE.

jako niesmaczne jak przy użyciu dosłowne jest, to lepiej, aby mieć bardziej wydajny kod, który działa na wersji JAX-WS zamiast ładniejszej kodu, który nie.

Mam nadzieję, że zespół JAX-WS naprawi ten problem i przywróci wartość JAXWSProperties.HTTP_EXCHANGE ponownie do wartości użytkowej.

Podziękowania dla wcześniejszych plakatów pokazujących różne sposoby wyszukiwania zdalnego adresu klientów JAX-WS. Informacja była bardzo przydatna :)

+0

Warto zauważyć, że przy połączeniu HTTPS nie ma wartości skojarzonej z kluczem '" com.sun.xml.ws.http.exchange "'. Ale z literałem literowym '" com.sun.xml.internal.ws.http.exchange "' możesz dostać obiekt i przesłać go do 'HttpsExchange'. Przetestowano za pomocą (oficjalnej) wersji Java 7 z JAX-WS 2.2. –

1

Oto odpowiedź, myślę, że należy zainicjować mc i req w metodzie WebMethod adnotacjami. Geting the IP Address Of A client For a webservice

+0

to co zrobiłem, że problem jest im przy użyciu wbudowanego serwera HTTP, więc: HttpServletRequest req = (HttpServletRequest) mc.get (MessageContext.SERVLET_REQUEST); jest niepoprawny, to właśnie szukam. Mimo to dziękuję – bazic

6

jeśli używamy wbudowany serwer HTTP, możemy uzyskać adres IP klienta tak:

@Resource 
WebServiceContext wsContext; 

Następnie w metodzie internetowej:

@WebMethod 
MessageContext msgx = wsContext.getMessageContext(); 
HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE); 
log.info("["+exchange.getRemoteAddress().getAddress()+"]) 

nadzieję, że pomoże komuś

-1

Poniższy kod może działać:

HttpServletRequest request = (HttpServletRequest) messageContext.get("transport.http.servletRequest"); 
String hostIp = request.getRemoteAddr(); 
+0

Jeśli chcesz uzyskać wystąpienie HttpServletRequest, użyj 'MessageContext.SERVLET_REQUEST' jako klucza –

Powiązane problemy