Java获取客户端真实IP

描述:

服务端在接收客户端请求的时候,为了保证系统的安全性,一般在服务端需要进行签名认证或者是对客户端ip进行访问控制,那么进行 ip 控制时,我们首先需要获取客户端请求的真实 ip 地址;

情况1:客户端未经过任何代理,直接访问服务器

String ip = request.getRemoteAddr() // 直接获取客户端 ip

情况2:客户端经过多级代理,最终访问服务器

/** 
* 获取当前网络ip 
* @param request 请求
* @return 
*/  
public String getIpAddr(HttpServletRequest request){  
    String ipAddress = request.getHeader("x-forwarded-for");  
    if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
        ipAddress = request.getHeader("Proxy-Client-IP");  
    }  
    if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
        ipAddress = request.getHeader("WL-Proxy-Client-IP");  
    }  
    if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
        ipAddress = request.getRemoteAddr();  
        if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){  
            // 根据网卡取本机配置的IP  
            InetAddress inet=null;  
            try {  
                inet = InetAddress.getLocalHost();  
            } catch (UnknownHostException e) {  
                e.printStackTrace();  
            }  
            ipAddress= inet.getHostAddress();  
        }  
    }  
    // 对于经过多个代理的情况 第一个IP为客户端真实IP 多个IP按照','分割  
    if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15  
        if(ipAddress.indexOf(",")>0){  
            ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));  
        }  
    }  
    return ipAddress;   
}