2012-10-04 27 views
9

Estoy tratando de recuperar la dirección IP del cliente con JAX-WS, he utilizado:ws JAX conseguir IP del cliente

@Resource 
WebServiceContext wsContext; 

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

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

me siento un NullPointerException en req, mc no es nulo.

Mi pregunta es ¿qué JAR usar para HttpServletRequest porque estoy usando una aplicación independiente de Java?

Gracias

Respuesta

15

Cómo obtener la dirección del cliente del servicio web para un servicio jax-ws depende de si usted es:

  • El funcionamiento de su servicio web como un servlet (en un contenedor Java EE), o
  • El funcionamiento de su servicio web como una aplicación independiente (Java SE 6 o 7).

Servlet Webservices Si el servicio web es un servlet a continuación, utilizar la solución del primer mensaje que contiene lo siguiente:

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

de aplicaciones de servicios web: JAX-WS 2.1 Si está utilizando una aplicación Java (Java SE) no tiene contexto de servlet, por lo que el HttpServletRequest será nulo. Es necesario utilizar el método de la post más adelante, el que tiene la siguiente línea:

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

Nota: esto sólo funciona con la aplicación 2.1 pila/referencia de JAX-WS.

de aplicación Webservices: JAX-WS 2.2

En JAX-WS 2.2 el valor de JAXWSProperties.HTTP_EXCHANGE ha cambiado de "com.sun.xml.ws.http.exchange" (el valor que estaba en JAX- WS 2.1) a "com.sun.xml.internal.ws.http.exchange". Eso significa que una llamada a

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

devolverá un valor nulo en JAX-WS 2.2 y obtendrá un NullPointerException en la segunda línea, y lo más importante, no se puede obtener la dirección remota del cliente.

Si usa la siguiente llamada (usando el valor literal, ugh!):

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

obtendrá un valor no nulo y podrá obtener la dirección del cliente.

Entonces, la forma de obtener la dirección remota del cliente depende de cómo despliega su código (servlet o aplicación) y qué versión de JAX-WS está utilizando (JAX-WS 2.1 o 2.2).

Recomendaciones

  • servlets: Si va a implementar su servicio web JAX-WS en un servlet siempre se puede utilizar la llamada para obtener la propiedad MessageContext.SERVLET_REQUEST no importa qué versión de JAX-WS 2 Tu estas usando.

  • Aplicaciones: Si va a implementar su servicio web JAX-WS en una aplicación siempre se puede utilizar la llamada HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange"); no importa si usted está utilizando JAX-WS 2.1 o 2.2, por lo tanto, es probable que sea mejor usar la cadena literal en su código en lugar del simbólico JAXWSProperties.HTTP_EXCHANGE.

tan desagradable como el uso de lo literal, es decir, que es mejor tener un código más robusto que funciona en versiones JAX-WS en lugar de código más bonito que no lo hace.

Espero que el equipo de JAX-WS corrija el problema en algún momento y restaure el valor de JAXWSProperties.HTTP_EXCHANGE nuevamente al valor útil.

Muchas gracias a los carteles anteriores que mostraron las diversas formas de encontrar la dirección remota de los clientes de JAX-WS. La información fue muy útil :)

+0

Cabe señalar que con una conexión HTTPS no hay ningún valor asociado con la clave '" com.sun.xml.ws.http.exchange "'. Pero con la cadena literal '" com.sun.xml.internal.ws.http.exchange "' puede obtener un objeto y convertirlo a 'HttpsExchange'. Probado con (oficial) Java 7 con JAX-WS 2.2. –

1

Aquí es una respuesta, creo que debe inicializar mc y req en el método WebMethod anotada. Geting the IP Address Of A client For a webservice

+0

que es lo que hice, el problema es im usando servidor HTTP, por lo que: HttpServletRequest req = (HttpServletRequest) mc.get (MessageContext.SERVLET_REQUEST); es incorrecto, eso es lo que estoy buscando. Gracias de todos modos – bazic

6

si utilizamos un servidor HTTP interno, podemos obtener la IP del cliente como esto:

@Resource 
WebServiceContext wsContext; 

Luego, en el método Web:

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

espero que ayude a otra persona

-1

el siguiente código podría funcionar:

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

Si desea obtener una instancia de HttpServletRequest, use 'MessageContext.SERVLET_REQUEST' como clave en su lugar –

Cuestiones relacionadas