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