如何获取 jax-ws 服务的 webservice 客户端地址取决于您是否:
- 将 Web 服务作为 servlet(在 Java EE 容器中)运行,或者
- 将 Web 服务作为独立应用程序(Java SE 6 或 7)运行。
Servlet Webservices
如果您的 Web 服务是一个 servlet,那么请使用包含以下内容的第一篇文章的解决方案:
HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
应用程序 Web 服务:JAX-WS 2.1
如果您使用的是 Java 应用程序 (Java SE),则您没有 servlet 上下文,因此HttpServletRequest
将为空。您需要使用后面帖子的方法,即具有以下行的方法:
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
在第二行得到 a,更重要的是,无法获取客户端的远程地址。
如果您改用以下调用(使用文字值,呃!):
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 客户端远程地址的各种方法。这些信息非常有用:)