29

我找到了一些在 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];
4

2 回答 2

60

答案很复杂。

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

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

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

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

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


那么,这意味着什么?好吧,基本上,这意味着通常您无法可靠地找出请求源自的系统的 IP 地址。

于 2013-08-21T06:53:45.303 回答
20

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

String ipAddress = request.getHeader("X-FORWARDED-FOR");  
if (ipAddress == null) {  
   ipAddress = request.getRemoteAddr();  
}
于 2013-08-21T06:42:10.717 回答