Java jax-ws获取客户端ip
我正在尝试使用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中
@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)
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
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();