NiceLeeのBlog 用爱发电 bilibili~

Java 获取真实客户端ip

2018-12-15
转载

阅读:


一般的Http请求跑到最终的处理端时都经过(多级)反向的代理,通过方法getRemoteAddr()得不到客户端真实IP,必须要经过一定处理。下面做个转载备份。

代码实现

/** 
 * 获取用户真实IP地址,不使用request.getRemoteAddr()的原因是有可能用户使用了代理软件方式避免真实IP地址, 
 * 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值 
 *  
 * @return ip
 */
private String getIpAddr(HttpServletRequest request) {
    String ip = request.getHeader("x-forwarded-for"); 
    System.out.println("x-forwarded-for ip: " + ip);
    if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {  
        // 多次反向代理后会有多个ip值,第一个ip才是真实ip
        if( ip.indexOf(",")!=-1 ){
            ip = ip.split(",")[0];
        }
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("Proxy-Client-IP");  
        System.out.println("Proxy-Client-IP ip: " + ip);
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("WL-Proxy-Client-IP");  
        System.out.println("WL-Proxy-Client-IP ip: " + ip);
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("HTTP_CLIENT_IP");  
        System.out.println("HTTP_CLIENT_IP ip: " + ip);
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
        System.out.println("HTTP_X_FORWARDED_FOR ip: " + ip);
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("X-Real-IP");  
        System.out.println("X-Real-IP ip: " + ip);
    }  
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getRemoteAddr();  
        System.out.println("getRemoteAddr ip: " + ip);
    } 
    System.out.println("获取客户端ip: " + ip);
    return ip;  
}

示例

样例示范

源地址

https://www.cnblogs.com/xiaoxing/p/6565573.html
https://blog.csdn.net/springmvc_springdata/article/details/43935113


内容
隐藏