我们一般通过request.getRemoteAddr()获取客户端ip地址,这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了,要通过如下方法
package com.jing.util;
import javax.servlet.http.HttpServletRequest;
/**
* @author jingguoqiang
* @desc 获取客户端ip地址
*/
public class IpUtils {
private IpUtils() {
}
/**
* @Description: 从代理的最上级开始剥皮
* @author: jingguoqiang
* @date 2015-9-23 下午2:43:46
*/
public static String getIpAddr(HttpServletRequest request) {
/*如果遇到了request.getRemoteAddr()获取的值为0:0:0:0:0:0:0:1,
为什么这个获取的值变成了ipv6了呢,这种情况只有在服务器和客户端都在同一台电脑上才会出现
(而且是用localhost访问的时候才会出现),后来上网查了查原因,原来是/etc/hosts这个东西
作怪(在windows上应该是C:\Windows\system32\drivers\etc\hosts这个文件),只需要注释掉文
件中的 # ::1 localhost 这一行即可解决问题*/
if (request == null) {
return "unknown";
}
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("X-Forwarded-For");
}
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("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
System.out.println(">>>>>>获取客户端ip地址"+ip);
return ip;
}
}