如何获取jax-ws服务的Web服务客户端地址取决于您是否:
- 将Web服务作为servlet运行(在Java EE容器中),或者
- 将Web服务作为独立应用程序运行(Java SE 6或7)。
Servlet Web服务如果您的Web服务是Servlet,请使用第一篇文章的解决方案,其中包含以下内容:
HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
应用程序Web服务:JAX-WS 2.1 如果您使用的是Java应用程序(Java
SE),则没有servlet上下文,因此
HttpServletRequest它将为null。您需要使用后面的文章中的方法,该方法包含以下行:
HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE);
注意:这仅适用于JAX-WS 2.1堆栈/引用实现。
应用程序Web服务:JAX-WS 2.2
在JAX-WS 2.2中,的值
JAXWSProperties.HTTP_EXCHANGE已从“
com.sun.xml.ws.http.exchange”(在JAX-WS 2.1中为该值)更改为“
com.sun.xml.internal.ws.http.exchange” ”。这意味着致电
HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE);InetSocketAddress remoteAddress = exchange.getRemoteAddress();String remoteHost = remoteAddress.getHostName();
在JAX-WS 2.2中将返回null,
NullPointerException第二行将显示一个,更重要的是,无法获取客户端的远程地址。
如果改用以下调用(使用文字值ugh!):
HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange");InetSocketAddress remoteAddress = exchange.getRemoteAddress();String remoteHost = remoteAddress.getHostName();您将获得一个非空值,并且将能够获得客户地址。
因此,如何获取客户端的远程地址取决于您如何部署代码(servlet或应用程序)以及所使用的JAX-WS版本(JAX-WS 2.1或2.2)。
推荐建议
Servlet :如果要在 Servlet 中部署JAX-WS Web服务,则
MessageContext.SERVLET_REQUEST
无论使用什么版本的JAX-WS 2,都可以始终使用该调用来获取属性。应用程序 :如果要在 应用程序 中部署JAX-WS Web服务,则
HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange");无论您使用的是JAX-WS 2.1还是2.2,都可以始终使用该调用,因此在代码中使用字符串文字而不是符号文字可能更好JAXWSProperties.HTTP_EXCHANGE
。
与使用文字一样令人厌烦的是,最好有更健壮的代码可以在JAX-WS版本中工作,而不是不能使用更漂亮的代码。
我希望JAX-WS团队在某个时候纠正该问题,然后
JAXWSProperties.HTTP_EXCHANGE再次将其值恢复为有用的值。
非常感谢早期的海报,这些海报显示了找到JAX-WS客户端的远程地址的各种方法。该信息非常有用:)



