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 :)
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. –