Java 获取请求的正确方式是什么';s ip

Java 获取请求的正确方式是什么';s ip,java,ip,Java,Ip,我找到了一些不同的方法在servlet中获取ip。但我不知道哪一个是对的,为什么 1: 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 ==

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

1:

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:


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

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

答案很复杂

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

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

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

您列出的标题没有一个是标准的,但是“x-forwarded-for”被认为是事实上的标准;i、 e.它是最有可能由代理插入的一个,等等。。。如果注射了什么

最后,即使你得到了一个IP地址,也不一定能帮到你。例如,如果客户端位于专用网络上,并通过NAT网关连接到internet,则HTTP请求中的IP地址将是NAT服务器的地址。。。不是实际的客户端IP



那么这一切意味着什么呢?基本上,这意味着一般来说,您无法可靠地找到请求来源的系统的IP地址。

检查此链接:谢谢您的回答,我们使用nginx+tomcat+spring+spring mvc+mybatis,我在中国,这是我关于stackoverflow的第二个问题,我的第一个问题失败了--!。我认为我们应该对它进行更多的测试。@sprite-您应该查看nginx文档,了解它使用的是什么头文件。但这只会给你下一个上游主机的IP地址。。。这可能不是真正的客户。正如我所说,你不能总是得到真正的客户端IP。。。即使你可以,它也不一定是可靠的、有用的或独特的。好吧,我几乎理解你的建议。“下一个上游主机的IP地址”是指最后一个代理的IP地址吗?@StephenC@sprite-是的。这是网络级别上唯一可用的IP地址。(想想看,你不能完全依赖IP地址的真实性……因为IP地址是可以被欺骗的。)除非它不是;请参阅我的答案。这将不起作用,因为X-Forwarded-For可以包含一个逗号分隔的代理IP地址列表(可以选择使用空格)!它可以,但正如其他答案已经指出的那样,该值完全取决于代理的配置,在这种情况下,作为安全预防措施,您将覆盖任何此类上串头,因为它们不可信。
 String ip=request.getHeader("x-forwarded-for");
                if(ip==null){
                    ip=request.getRemoteAddr();
                }
                String ips[]=ip.split(",");`
                                ip=ips[0];
String ipAddress = request.getHeader("X-FORWARDED-FOR");  
if (ipAddress == null) {  
   ipAddress = request.getRemoteAddr();  
}