【问题标题】:Getting null value for request.getHeader("X-FORWARDED-FOR") while retrieving client IP address in java?在java中检索客户端IP地址时获取request.getHeader(“X-FORWARDED-FOR”)的空值?
【发布时间】:2014-10-27 01:58:18
【问题描述】:

我在 Tomcat 6.0 上部署了我的 Web 应用程序,机器的 IP 地址为 10.xx.xx.90。然后我从具有 ip 地址 (10.xx.xx.56) 的 m/c 向这个应用程序发出 http 请求(来自浏览器)。

我正在尝试使用以下代码在我的应用程序中获取客户端 (10.xx.xx.56) 的 IP 地址。但是我得到了 request.getHeader("X-FORWARDED-FOR") 的空值,其中 request.getRemoteAddr() 返回部署应用程序的机器的 IP 地址,即 10.xx.xx.90。

但是,如果我从独立的 java 程序对应用程序进行 http 调用,我可以获取客户端 m/c ip 地址。那么,获取客户端IP地址的正确方法是什么。我需要在我的 tomcat 中配置一些东西吗??

   String ipAddress = request.getHeader("X-FORWARDED-FOR");  
       if (ipAddress == null) {  
       ipAddress = request.getRemoteAddr();  
   }

【问题讨论】:

  • 你怎么知道ipAddressrequest.getHeader("X-FORWARDED-FOR") 之后为空?您是登录还是只是猜测? request.getRemoteAddr() 将返回客户端的 IP,而 request.getHeader("X-FORWARDED-FOR") 将返回所有 IP(包括代理)。所以你可能会从request.getHeader("X-FORWARDED-FOR")
  • @pmp 我正在记录 ip 地址值并在 request.getHeader("X-FORWARDED-FOR") 的日志中获取空值。调试时也会在本地获取空值。
  • 在TOMCAT之前有没有代理服务器或者负载均衡器?
  • @kasharma:这里没有负载均衡器,但我不知道代理服务器。如何检查是否有代理服务器?
  • 假设 tomact 服务器 ip 是 (X.Y.Z) 和代理服务器 ip 是 (P.Q.R) 如果您从浏览器直接制作 X.Y.Z/your_app/,that 意味着两者之间没有代理。如果您没有直接访问服务器并且它正在通过如下P.Q.R/proxy --> X.Y.Z/your_app 进行路由,这就是代理的工作原理,我向您提出了这个问题,因为代理服务器可能会修改x-forwarded-for 标头。

标签: java tomcat jakarta-ee networking ip


【解决方案1】:

如果您使用的是reverse proxy,您应该知道。但是,最终客户端可能位于常规 Web 代理之后。无论如何,负载均衡器或代理会设置“X-Forwarded-For”。来自Wikipedia的文章,

X-Forwarded-For (XFF) HTTP 标头字段是一个事实上的标准,用于识别通过 HTTP 代理或负载平衡器连接到 Web 服务器的客户端的原始 IP 地址。

根据您的 cmets 和问题,没有代理或负载平衡器。对于最佳实践,我建议您先检查该标题。如果它为空,则使用request.getRemoteAddr()(您报告为工作)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-17
    • 2021-01-23
    • 2021-05-25
    • 2021-06-08
    • 2011-09-09
    • 2021-05-02
    • 2014-04-23
    • 2019-01-14
    相关资源
    最近更新 更多