获取请求的ip的正确方法是什么

spr*_*ite 24 java ip

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

1:

request.getHeader( "X-Real-IP" )
Run Code Online (Sandbox Code Playgroud)

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();  
    } `
Run Code Online (Sandbox Code Playgroud)

3:

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

Ste*_*n C 54

答案很复杂.

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

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

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

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

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


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


小智 16

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

String ipAddress = request.getHeader("X-FORWARDED-FOR");  
if (ipAddress == null) {  
   ipAddress = request.getRemoteAddr();  
}
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用,因为X-Forwarded-For可以包含逗号分隔(可选地带有空白)代理IP地址列表! (9认同)
  • 除非它没有; 看我的答案. (5认同)