Java jax-ws获取客户端ip

Java jax-ws获取客户端ip,java,web-services,jax-ws,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中

我正在尝试使用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不是null

我的问题是,因为我使用的是Java独立应用程序,所以要将哪个JAR用于
HttpServletRequest


谢谢

这里有一个答案,我认为您应该在WebMethod注释的方法中初始化mc和req。

如果我们使用嵌入式Http服务器,我们可以获得如下客户端IP:

@Resource
WebServiceContext wsContext;
然后在web方法中:

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

希望它能帮助其他人

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

  • 将webservice作为servlet运行(在JavaEE容器中),或
  • 将webservice作为独立应用程序运行(JavaSE6或7)
Servlet Web服务 如果您的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-WS2.1堆栈/参考实现

应用程序Web服务:JAX-WS 2.2

在JAX-WS2.2中,
JAXWSProperties.HTTP_EXCHANGE
的值已从“com.sun.xml.WS.HTTP.EXCHANGE”(JAX-WS2.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-WS2.2中返回null,您将在第二行获得
NullPointerException
,更重要的是,无法获得客户端的远程地址

如果改用以下调用(使用文本值,呃!):

您将获得一个非空值,并且能够获得客户机地址

因此,如何获得客户机的远程地址取决于如何部署代码(servlet或应用程序)以及使用哪个版本的JAX-WS(JAX-WS 2.1或2.2)

建议

  • Servlets:如果要在servlet中部署JAX-WS Web服务,则无论您使用的是哪一版本的JAX-WS 2,都可以始终使用该调用来获取属性
    MessageContext.servlet\u REQUEST

  • 应用程序:如果在应用程序中部署JAX-WS Web服务,则始终可以使用调用
    HttpExchange exchange=(HttpExchange)msgx.get(“com.sun.xml.WS.http.exchange”)无论您使用的是JAX-WS2.1还是2.2,因此在代码中使用字符串文字可能比使用符号
    JAXWSProperties.HTTP\u EXCHANGE
    更好

与使用文字一样令人不快的是,最好有更健壮的代码跨JAX-WS版本工作,而不是没有的更漂亮的代码

我希望JAX-WS团队在某个时候纠正这个问题,并将
JAXWSProperties.HTTP_EXCHANGE
的值再次恢复为有用的值


多亏了早期的海报,展示了查找JAX-WS客户端远程地址的各种方法。这些信息非常有用:)

以下代码可能会起作用:

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

这就是我所做的,问题是im使用嵌入式HTTP服务器,所以:HttpServletRequest req=(HttpServletRequest)mc.get(MessageContext.SERVLET\u REQUEST);不正确,这就是我要找的。无论如何,谢谢如果您想要获取HttpServletRequest的实例,请使用
MessageContext.SERVLET\u REQUEST
作为密钥,注意,使用HTTPS连接时,没有与密钥
“com.sun.xml.ws.http.exchange”
关联的值。但是使用字符串literal
“com.sun.xml.internal.ws.http.exchange”
可以获取一个对象并将其强制转换为
HttpsExchange
。通过JAX-WS2.2使用(官方)Java7进行测试。
HttpServletRequest request = (HttpServletRequest) messageContext.get("transport.http.servletRequest");
String hostIp = request.getRemoteAddr();