通常狀況下,咱們經過request.getRemoteAddr()方法就能獲取訪問客戶端的IP,然而在互聯網環境使用各類代理服務器的狀況下,就沒那麼簡單了,極端狀況是使用了多個代理服務器或匿名代理服務器。對於具備欺騙性的代理咱們也無能爲力,但至少獲取到一個正確的IP是必須的。 java
直接上代碼
public static String getRemoteIp(HttpServletRequest request)
{
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.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();
}
if(StringUtils.contains(ip, ",")) //若是存在多個反向代理,得到的IP是一個用逗號分隔的IP集合,取第一個
{
ip = StringUtils.substringBefore(ip, ",");
}
return ip;
}
說明
- REMOTE_ADDR: 是你的客戶端跟你的服務器「握手」時候的IP。若是使用了「匿名代理」,REMOTE_ADDR將顯示代理服務器的IP。
- HTTP_CLIENT_IP: 是代理服務器發送的HTTP頭。若是是「超級匿名代理」,則返回none值。一樣,REMOTE_ADDR也會被替換爲這個代理服務器的IP。
- X-Forwarded-For: 簡稱XFF頭,它表明客戶端,也就是HTTP的請求端真實的IP,只有在經過了HTTP 代理(好比APACHE代理)或者負載均衡服務器時纔會添加該項。它不是RFC中定義的標準請求頭信息,在squid緩存代理服務器開發文檔中能夠找到該項的詳細介紹。標準格式以下:X-Forwarded-For: client1, proxy1, proxy2
- Proxy-Client-IP 字段和 WL-Proxy-Client-IP 字段只在 Apache(Weblogic Plug-In Enable)+WebLogic 搭配下出現,其中「WL」 就是 WebLogic 的縮寫。即訪問路徑是:Client -> Apache WebServer + Weblogic http plugin -> Weblogic Instances
特殊狀況
透明代理
- REMOTE_ADDR = 最後一個代理服務器 IP
- HTTP_CLIENT_IP = 代理服務器 IP
- HTTP_X_FORWARDED_FOR = 您的真實 IP ,通過多個代理服務器時,這個值相似以下:203.98.182.163, 203.98.182.163, 203.129.72.215。
普通匿名代理
- REMOTE_ADDR = 最後一個代理服務器 IP
- HTTP_CLIENT_IP = 代理服務器 IP
- HTTP_X_FORWARDED_FOR = 代理服務器 IP ,通過多個代理服務器時,這個值相似以下:203.98.182.163, 203.98.182.163, 203.129.72.215。
欺騙性代理
- REMOTE_ADDR = 代理服務器 IP
- HTTP_CLIENT_IP = 代理服務器 IP
- HTTP_X_FORWARDED_FOR = 隨機的 IP ,通過多個代理服務器時,這個值相似以下:203.98.182.163, 203.98.182.163, 203.129.72.215。
高匿名代理
- REMOTE_ADDR = 代理服務器 IP
- HTTP_CLIENT_IP = 沒數值或不顯示
- HTTP_X_FORWARDED_FOR = 沒數值或不顯示 ,通過多個代理服務器時,這個值相似以下:203.98.182.163, 203.98.182.163, 203.129.72.215。