| 方法 | 返回值 | 典型場景 |
|---|---|---|
getRemoteAddr() | 客戶端IP 地址 | 記錄訪問日誌、IP 限流 |
getRemoteHost() | 客戶端主機名(解析失敗時退回 IP) | 顯示主機名、內網環境識別 |
0:0:0:0:0:0:0:1原因:IPv6 回環地址 ::1 的展開形式。解決:
server.xml 配置 address="0.0.0.0" 強制 IPv4ip.replace("0:0:0:0:0:0:0:1", "127.0.0.1")當客戶端經過 Nginx、Apache、CDN 等中間層,getRemoteAddr() 返回的是代理服務器 IP。需讀取 HTTP 頭:
public static String getRealIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// 多級代理取第一個非 unknown IP
if (ip != null && ip.contains(",")) {
String[] ips = ip.split(",");
for (String s : ips) {
if (!"unknown".equalsIgnoreCase(s.trim())) {
return s.trim();
}
}
}
return ip;
}
X-Forwarded-For 格式:client, proxy1, proxy2,第一個非 unknown 為真實客戶端 IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; (Nginx)