我找到了一些在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];
答案 0 :(得分:49)
答案很复杂。
如果您的servlet在反向代理或负载均衡器后面的Web服务器上运行,则可以将该Web代理配置为注入请求标头,该标头提供请求来自的IP地址。不同的反向代理将注入不同的头。请参阅(前端)服务器的文档。
如果您的客户端使用(转发)代理,则可能插入标头以说明客户端IP地址是什么......或者它可能不会。它插入的IP地址可能不正确。
通过调用request.getRemoteAddr()
获得的值将是请求 immediate 上游源的IP地址。
您列出的标题都不是标准的,但“x-forwarded-for”被认为是事实上的标准;即它是最有可能被代理人插入的等等......如果有任何东西被注入。
最后,即使您确实获得了IP地址,也不一定对您有所帮助。例如,如果客户端位于专用网络上并通过NAT网关连接到Internet,则HTTP请求中的IP地址将是NAT服务器的地址...而不是实际的客户端IP。
那么这一切意味着什么呢?基本上,这意味着一般你不能可靠地找出请求来自的系统的IP地址。
答案 1 :(得分:15)
这似乎是我们为获取客户端的原始IP地址而做的最多的事情
String ipAddress = request.getHeader("X-FORWARDED-FOR");
if (ipAddress == null) {
ipAddress = request.getRemoteAddr();
}