2012-10-04 8 views
9

sto cercando di recuperare l'IP del client con JAX-WS, ho usato:ws JAX ottenere IP Client

@Resource 
WebServiceContext wsContext; 

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

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

ottengo un NullPointerException in req, mc non è nullo.

La mia domanda è quale JAR utilizzare per HttpServletRequest perché sto usando un'applicazione Java stand-alone?

Grazie

risposta

15

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

+0

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

1

Ecco una risposta, penso che si dovrebbe inizializzare mc e req nel metodo annotato WebMethod. Geting the IP Address Of A client For a webservice

+0

è quello che ho fatto, il problema è im utilizzando server HTTP integrato, in modo da: HttpServletRequest req = (HttpServletRequest) mc.get (MessageContext.SERVLET_REQUEST); non è corretto, questo è quello che sto cercando. Grazie comunque – bazic

6

se utilizziamo un server HTTP integrato, possiamo ottenere l'IP del client come questo:

@Resource 
WebServiceContext wsContext; 

Poi nel metodo web:

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

Speranza che aiuta qualcun altro

-1

Il codice seguente potrebbe funzionare:

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

Se si desidera ottenere un'istanza di HttpServletRequest, utilizzare 'MessageContext.SERVLET_REQUEST' come chiave –

Problemi correlati