【问题标题】:what is the right way to get request's ip [duplicate]获取请求的IP的正确方法是什么[重复]
【发布时间】:2013-08-23 09:43:50
【问题描述】:

我找到了一些在 servlet 中获取 ip 的不同方法。但我不知道哪个是对的,为什么。

1:

request.getHeader( "X-Real-IP" )

2:

  String ip = request.getHeader("X-Forwarded-For"); 
  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("WL-Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("HTTP_CLIENT_IP");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getRemoteAddr();  
    } `

3:

 String ip=request.getHeader("x-forwarded-for");
                if(ip==null){
                    ip=request.getRemoteAddr();
                }
                String ips[]=ip.split(",");`
                                ip=ips[0];

【问题讨论】:

标签: java ip


【解决方案1】:

答案很复杂。

  • 如果您的 servlet 在反向代理或负载平衡器后面的 Web 服务器上运行,则可以将该 Web 代理配置为注入一个请求标头,该标头提供请求来自的 IP 地址。不同的反向代理将注入不同的标头。请查阅您的(前端)服务器的文档。

  • 如果您的客户端使用(转发)代理,那么它可能插入标头来说明客户端 IP 地址是什么......或者它可能不是。而且它插入的 IP 地址可能不正确。

  • 您通过调用request.getRemoteAddr() 获得的值将是请求的直接上游源的IP 地址。

您列出的标题都不是标准的,但“x-forwarded-for”被认为是事实上的标准;即它最有可能被代理插入,等等……如果有任何东西被注入。

最后,即使您确实获得了 IP 地址,它也不一定对您有帮助。例如,如果客户端位于私有网络上并通过 NAT 网关连接到 Internet,则 HTTP 请求中的 IP 地址将是 NAT 服务器的地址......而不是实际的客户端 IP。


那么这一切意味着什么?嗯,基本上,这意味着一般你不能可靠地找出请求来自的系统的IP地址。

【讨论】:

  • 感谢您的精彩回答,我们使用 nginx+tomcat+spring +spring mvc+mybatis ,我在中国,这是我在 stackoverflow 上的第二个问题,我的第一个问题失败了--!。我认为我们应该对它做更多的测试。
  • @sprite - 您应该查看 nginx 文档以了解它使用的标头。但这只会为您提供下一个上游主机的 IP 地址……这可能不是真正的客户端。正如我所说,你不可能总是得到真正的客户端 IP……即使你能得到,它也不一定是可靠的、有用的或独特的。
  • 好的,我几乎明白你的建议。 '下一个上游主机的IP地址'是指最后一个代理的IP地址吗?@Stephen C
  • @sprite - 是的。这是网络级别唯一可用的 IP 地址。 (想想看,你不能完全依赖 那个 IP 地址是真实的......因为 IP 地址可以被欺骗。)
【解决方案2】:

这似乎是我们能做的最多的事情来获取客户端的原始 IP 地址

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

【讨论】:

  • 除非没有;看我的答案。
  • 这将不起作用,因为 X-Forwarded-For 可以包含一个逗号分隔(可选用空格)的代理 IP 地址列表!
  • 它可以,但正如其他答案已经指出的那样,该值完全取决于 your 代理的配置,在这种情况下,您将覆盖任何这样的 upstring 标头作为安全预防措施,因为它们不可信。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2015-10-12
相关资源
最近更新 更多