
java如何获取访问请求ip
用户关注问题
在Java Web开发中,访问请求的IP地址可能因为代理服务器或负载均衡而不是用户的真实IP,如何正确获取客户端的真实IP?
通过检查HTTP请求头获取真实IP
可以通过HttpServletRequest对象的getHeader方法依次检查'X-Forwarded-For'、'Proxy-Client-IP'、'WL-Proxy-Client-IP'等HTTP头。若这些头部不存在或为空,再调用getRemoteAddr()方法获取IP地址。这样能尽可能捕获客户端的真实IP。示例代码:
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.getRemoteAddr();
}
用request.getRemoteAddr()获取IP时发现得出的结果是代理服务器的IP地址,这是什么原因?
代理服务器和负载均衡对IP获取的影响
getRemoteAddr()方法返回的是直接连接服务器的客户端地址,当请求经过代理或负载均衡时,这个地址通常是代理服务器的IP,而非真实用户的IP。这种情况下需要额外检查HTTP请求头中的'X-Forwarded-For'等字段,因为代理通常会在这些字段中保存原始客户端的IP信息。
在检查'X-Forwarded-For'头时发现多个IP地址,该如何确定哪个IP是客户端的真实IP?
从多个IP中提取用户的真实IP地址
当'X-Forwarded-For'头包含多个IP地址,通常它们用逗号分隔,最左边的IP一般是客户端真实IP,后面的IP是经过的代理服务器地址。因此,可以将该头的值按逗号分隔,取第一个非unknown的IP作为客户端IP。