11

我正在尝试使用 JAX-WS 检索客户端 IP,我使用了:

@Resource
WebServiceContext wsContext; 

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

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

我得到一个NullPointerExceptionin req,mc 不为空。

我的问题是使用哪个 JAR,HttpServletRequest因为我使用的是 Java 独立应用程序?

谢谢

4

4 回答 4

18

如何获取 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 客户端远程地址的各种方法。这些信息非常有用:)

于 2012-12-03T22:37:27.007 回答
8

如果我们使用嵌入式 Http 服务器,我们可以像这样获取客户端 IP:

@Resource
WebServiceContext wsContext;

然后在网络方法中:

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

希望它可以帮助别人

于 2012-10-10T09:34:28.080 回答
1

这是一个答案,我认为您应该在 WebMethod 注释方法中初始化 mc 和 req 。 获取 Web 服务的客户端 IP 地址

于 2012-10-04T13:20:18.460 回答
-1

以下代码可能有效:

HttpServletRequest request = (HttpServletRequest) messageContext.get("transport.http.servletRequest");
String hostIp = request.getRemoteAddr();
于 2015-05-21T08:43:27.707 回答