通常狀況下,咱們經過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; }