獲取客戶端IP:支持多級反向代理下【轉】

  通常狀況下,咱們經過request.getRemoteAddr()方法就能獲取訪問客戶端的IP,然而在互聯網環境使用各類代理服務器的狀況下,就沒那麼簡單了,極端狀況是使用了多個代理服務器或匿名代理服務器。對於具備欺騙性的代理咱們也無能爲力,但至少獲取到一個正確的IP是必須的。緩存

   public static String getRemoteIp(HttpServletRequest request){
        
        if(request == null) return null;
        
         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。
相關文章
相關標籤/搜索