如何获取 jax-ws 服务的 webservice 客户端地址取决于你是否是:
- 将 Web 服务作为 servlet(在 Java EE 容器中)运行,或者
- 将 Web 服务作为独立应用程序(Java SE 6 或 7)运行。
Servlet 网络服务
如果您的网络服务是 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,更重要的是,无法获取客户端的远程地址。
如果您改用以下调用(使用文字值,呃!):
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 服务,则无论您使用什么版本的 JAX-WS 2,您始终可以使用调用来获取属性 MessageContext.SERVLET_REQUEST正在使用。
应用程序:如果您在应用程序中部署 JAX-WS Web 服务,无论您使用的是 JAX-WS 2.1 还是 2.2,您始终可以使用调用 HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange");,因此在代码中使用字符串文字可能比使用符号 JAXWSProperties.HTTP_EXCHANGE 更好。
与使用文字一样令人讨厌,最好有更健壮的代码可以跨 JAX-WS 版本工作,而不是更漂亮的代码不能。
我希望 JAX-WS 团队在某个时候纠正这个问题,并再次将 JAXWSProperties.HTTP_EXCHANGE 的值恢复到有用的值。
非常感谢早期的海报展示了查找 JAX-WS 客户端远程地址的各种方法。这些信息非常有用:)