当前位置: 首页 > 面试题库 >

jax ws获取客户端IP

厍晋鹏
2023-03-14
问题内容

我尝试使用JAX-WS检索客户端IP,我曾经使用过:

@Resource
WebServiceContext wsContext;

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

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

我在要求中得到一个NullPointerException,mc不为空。

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

谢谢


问题答案:

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

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

Servlet Web服务如果您的Web服务是Servlet,请使用第一篇文章的解决方案,其中包含以下内容:

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

应用程序Web服务: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第二行将显示一个,更重要的是,无法获取客户端的远程地址。

如果改用以下调用(使用文字值ugh!):

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



 类似资料:
  • 问题内容: 我需要知道客户的IP地址,这是我的鳕鱼 处理程序: 结果: 为什么我无法获得真正的客户IP? 问题答案: 通常,您可以用来获取正在访问Web应用程序的客户端的IP地址。但是,如果用户位于代理服务器后面或通过负载均衡器访问您的Web服务器(例如,在云托管中),则上述代码段将获取代理服务器或负载均衡器服务器的IP地址,而不是原始IP地址客户。 因此,您应该获得请求的HTTP标头“ X-Fo

  • 问题内容: req.connection.remoteAddress,req.headers [‘x-forwarded- for’],req.ip,req.ips,这是什么意思? 是否有一种简单的方法可以简单地获取在Node.js / Express中向我的站点发出请求的客户端/用户代理的IP地址?我不了解所有代理内容,也不了解req对象的所有属性之间的所有区别。另外,我不了解Express的“

  • get_client_ip($type = 0, $adv = false) 功能 获取客户端IP地址 参数 $type: string 返回类型 0 返回IP地址 1 返回IPV4地址数字 $adv: boolean 是否进行高级模式获取(有可能被伪装) 返回 string 客户端IP地址

  • get_client_ip($type = 0, $adv = false) 功能 获取客户端IP地址 参数 $type: string 返回类型 0 返回IP地址 1 返回IPV4地址数字 $adv: boolean 是否进行高级模式获取(有可能被伪装) 返回 string 客户端IP地址

  • 获取环境相关信息 var info = Tida.appinfo; 返回 json 格式: { "engine": "tmm", "name": "tmall", "engineVer": "4.9.2", "ver": "4.9.2" } 比较全面的环境相关判断 lib.env.params - url中search参数的对象,例如有ttid参数可以通过lib

  • 本文向大家介绍Java根据Request获取客户端IP,包括了Java根据Request获取客户端IP的使用技巧和注意事项,需要的朋友参考一下 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将http://1