多級反向代理下獲取客戶端IP

      通常狀況下,咱們經過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。
相關文章
相關標籤/搜索