baz*_*zic 10 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()+"])
Run Code Online (Sandbox Code Playgroud)
我得到一个NullPointerExceptionin req,mc不是null.
我的问题是使用哪个JAR,HttpServletRequest因为我使用的是Java独立应用程序?
谢谢
小智 17
如何获取jax-ws服务的webservice客户端地址取决于你是否:
Servlet Webservices 如果您的Web服务是servlet,那么使用包含以下内容的第一篇文章的解决方案:
HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
Run Code Online (Sandbox Code Playgroud)
应用程序Web服务:JAX-WS 2.1
如果您使用的是Java应用程序(Java SE),则没有servlet上下文,因此HttpServletRequest将为null.您需要使用后面帖子的方法,即具有以下行的方法:
HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE);
Run Code Online (Sandbox Code Playgroud)
注意:这仅适用于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();
Run Code Online (Sandbox Code Playgroud)
将在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();
Run Code Online (Sandbox Code Playgroud)
您将获得一个非null值,并将能够获取客户端地址.
因此,如何获取客户端的远程地址取决于您部署代码(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客户端远程地址的各种方法.这些信息非常有用:)
如果我们使用嵌入式Http服务器,我们可以像这样得到客户端IP:
@Resource
WebServiceContext wsContext;
Run Code Online (Sandbox Code Playgroud)
然后在web方法中:
@WebMethod
MessageContext msgx = wsContext.getMessageContext();
HttpExchange exchange = (HttpExchange)msgx.get(JAXWSProperties.HTTP_EXCHANGE);
log.info("["+exchange.getRemoteAddress().getAddress()+"])
Run Code Online (Sandbox Code Playgroud)
希望它可以帮助别人
| 归档时间: |
|
| 查看次数: |
17371 次 |
| 最近记录: |