1. 程式人生 > >如何獲取客戶端真實ip地址

如何獲取客戶端真實ip地址

    在專案中需要獲取客戶端的真實IP地址,原本使用的是request.getRemoteAddr(),後來釋出到伺服器上時發現取到的值一直是127.0.0.1

      原因是,在部署時用了nginx進行反向代理,

(小插曲:配nginx的時候一定要記得配 X-Real-IP和 X-Forwarded-For如下,不然還是取不到啊)


解決辦法:

      經過代理以後,由於在客戶端和服務之間增加了中間層,因此伺服器無法直接拿到客戶端的IP,伺服器端應用也無法直接通過轉發請求的地址返回給客戶端。但是在轉發請求的HTTP頭資訊中,增加了 X-Real-IP和 X-Forwarded-For資訊。即可獲取。

public static String getIpAddress(HttpServletRequest request) {  
        String ip = request.getHeader("x-forwarded-for");  
        String xip = request.getHeader("X-Real-IP");
        if(ip != null && ip.length()!=0 && !ip.equalsIgnoreCase("unKnown")){
        	int index = ip.indexOf(",");
        	if(index != -1){
        		return ip.substring(0,index);
        	}else{
        		return ip;
        	}
        }
        ip = xip;
        if(ip != null && ip.length()!=0 && !ip.equalsIgnoreCase("unKnown")){
        	return ip;
        }
        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();  
        }  
        return ip;  
    }
參考:http://dpn525.iteye.com/blog/1132318