jax获取客户端IP

时间:2012-10-04 13:08:14

标签: java web-services jax-ws

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

@Resource
WebServiceContext wsContext; 

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

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

我在req中得到NullPointerException,mc不为空。

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

由于

4 个答案:

答案 0 :(得分:16)

如何获取jax-ws服务的webservice客户端地址取决于你是否:

  • 将您的Web服务作为servlet(在Java EE容器中)或
  • 运行
  • 将您的Web服务作为独立应用程序运行(Java SE 6或7)。

Servlet Webservices 如果您的webservice是servlet,那么使用包含以下内容的第一篇文章的解决方案:

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

Application Webservices: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,更重要的是,无法获取客户端的远程地址。

如果您使用以下调用(使用文字值,唉!):

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)。

<强>推荐

  • Servlets :如果要在servlet中部署JAX-WS Web服务,无论JAX-WS的版本是什么,都可以使用该调用来获取属性MessageContext.SERVLET_REQUEST 2你正在使用。

  • 应用程序:如果要在应用程序中部署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客户端远程地址的各种方法。这些信息非常有用:)

答案 1 :(得分:6)

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

@Resource
WebServiceContext wsContext;

然后在网络方法中:

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

希望它可以帮助别人

答案 2 :(得分:1)

这是一个答案,我认为你应该在WebMethod注释方法中初始化mc和req。 Geting the IP Address Of A client For a webservice

答案 3 :(得分:-1)

以下代码可能有效:

HttpServletRequest request = (HttpServletRequest) messageContext.get("transport.http.servletRequest");
String hostIp = request.getRemoteAddr();