首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Web 獲取客戶端真實 IP:穿透 Nginx/代理的通用工具類

     編輯:程式設計綜合問答

核心方法

public static String getClientIp(HttpServletRequest request) {
    String ip = request.getHeader("X-Forwarded-For");
    if (isValid(ip)) return ip.split(",")[0].trim(); // 取第一個非代理 IP
    
    ip = request.getHeader("X-Real-IP");
    if (isValid(ip)) return ip;
    
    ip = request.getHeader("Proxy-Client-IP");
    if (isValid(ip)) return ip;
    
    ip = request.getHeader("WL-Proxy-Client-IP");
    if (isValid(ip)) return ip;
    
    ip = request.getHeader("HTTP_CLIENT_IP");
    if (isValid(ip)) return ip;
    
    ip = request.getHeader("HTTP_X_FORWARDED_FOR");
    if (isValid(ip)) return ip;
    
    return request.getRemoteAddr(); // 最後兜底
}

private static boolean isValid(String ip) {
    return ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip);
}

原理解析

  • X-Forwarded-For:標準代理頭,格式 client, proxy1, proxy2,首個為真實客戶端。
  • X-Real-IP:Nginx proxy_set_header X-Real-IP $remote_addr; 設置的單一真實 IP。
  • 其餘頭為 WebLogic、Squid、Akamai 等特定代理使用。
  • getRemoteAddr():直連時返回客戶端 IP,經代理時返回代理服務器 IP。

生產環境部署要點

  1. Nginx 配置:
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  2. 應用服務器信任代理:Tomcat RemoteIpValve 解析頭並覆蓋 request.remoteAddr,後續 request.getRemoteAddr() 即為真實 IP,無需手動解析。
  3. 安全防範:頭可偽造,需在網關層清洗/驗證,或僅信任內網代理 IP 範圍。

補充:獲取 MAC 地址(僅限內網)

同一廣播域可用 nbtstat -A <ip> 或 ARP 表解析,跨路由不可行。生產環境勿依賴 MAC 做身份識別。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved