Come ottenere l'indirizzo del client webservice per un servizio jax-ws dipende dal fatto che tu sia:
- Il funzionamento del vostro webservice come un servlet (in un container Java EE), o
- Il funzionamento del vostro webservice come applicazione stand-alone (Java SE 6 o 7).
Servlet Webservices Se il webservice è un servlet quindi utilizzare la soluzione del primo messaggio che contiene il seguente:
HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
Applicazione Webservices: JAX-WS 2.1 Se sei usando un'applicazione Java (Java SE) non hai un contesto servlet, quindi HttpServletRequest
sarà nullo. È necessario utilizzare il metodo del post successivo, quello che ha la seguente linea:
HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE);
Nota: questo funziona solo con l'attuazione 2.1 pila/riferimento JAX-WS.
Webservices applicazione: JAX-WS 2.2
In JAX-WS 2.2 il valore di JAXWSProperties.HTTP_EXCHANGE
è cambiato da "com.sun.xml.ws.http.exchange" (il valore era in JAX- WS 2.1) a "com.sun.xml.internal.ws.http.exchange". Ciò significa che una chiamata a
HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE);
InetSocketAddress remoteAddress = exchange.getRemoteAddress();
String remoteHost = remoteAddress.getHostName();
ritorna null a JAX-WS 2.2 e si otterrà un NullPointerException
sulla seconda linea, e più importante, non è possibile ottenere l'indirizzo remoto del client.
Se si utilizza invece la seguente chiamata (utilizzando il valore letterale, ugh!):
HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange");
InetSocketAddress remoteAddress = exchange.getRemoteAddress();
String remoteHost = remoteAddress.getHostName();
otterrete un valore non nullo e sarà in grado di ottenere l'indirizzo del cliente.
Quindi, come si ottiene l'indirizzo remoto del client dipende da come si distribuisce il codice (servlet o applicazione) e da quale versione di JAX-WS si sta utilizzando (JAX-WS 2.1 o 2.2).
Raccomandazioni
Servlet: Se si distribuisce il tuo webservice JAX-WS in un servlet si può sempre utilizzare la chiamata per ottenere la proprietà MessageContext.SERVLET_REQUEST
non importa quale versione di JAX-WS 2 tu stai usando.
Applicazioni: Se si distribuisce il tuo webservice JAX-WS in un'applicazione si può sempre utilizzare la chiamata HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange");
non importa se si sta utilizzando JAX-WS 2.1 o 2.2, quindi è probabilmente meglio utilizzare la stringa letterale nel codice piuttosto che simbolico JAXWSProperties.HTTP_EXCHANGE
.
giudicato di cattivo gusto che utilizza il letterale è, è meglio avere il codice più robusto che funziona su versioni JAX-WS, piuttosto che il codice più bella che non lo fa.
Spero che il team JAX-WS corregga il problema qualche volta e ripristini nuovamente il valore di JAXWSProperties.HTTP_EXCHANGE
.
Mille grazie ai poster precedenti che mostravano i vari modi di trovare l'indirizzo remoto dei client JAX-WS. L'informazione è stata molto utile :)
Potrebbe essere degno di nota il fatto che con una connessione HTTPS non vi sia alcun valore associato alla chiave '" com.sun.xml.ws.http.exchange "'. Ma con la stringa letterale '" com.sun.xml.internal.ws.http.exchange "' puoi ottenere un oggetto e lanciarlo su 'HttpsExchange'. Testato con Java (ufficiale) con JAX-WS 2.2. –