我发现了一些在 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];
答案很复杂。
如果您的 servlet 运行在反向代理或负载均衡器后面的 Web 服务器上,则可以将该 Web 代理配置为注入一个请求标头,该标头给出请求来自的 IP 地址。不同的反向代理将注入不同的标头。请参阅您的(前端)服务器的文档。
如果您的客户端使用(转发)代理,那么它might插入标头来说明客户端 IP 地址是什么……也可能不是。以及它插入的IP地址might是不正确的。
您通过调用获得的价值request.getRemoteAddr()
将是 IP 地址即时请求的上游源。
您列出的标头都不是标准的,但“x-forwarded-for”被认为是事实上的标准;也就是说,它是最有可能被代理插入的一个,等等......如果注入了任何东西。
最后,即使您确实获得了 IP 地址,也不一定对您有帮助。例如,如果客户端位于专用网络上并通过 NAT 网关连接到互联网,则 HTTP 请求中的 IP 地址将是 NAT 服务器的地址……而不是实际的客户端 IP。
那么,这意味着什么?基本上,这意味着一般来说你不能reliably找出发出请求的系统的 IP 地址。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)