获取请求 IP 地址的代码片段
获取请求 IP 地址的代码片段
public class NetworkUtil {
public static String getIpAddress(ServerHttpRequest request) {
// 获取请求头信息 HttpHeaders
HttpHeaders headers = request.getHeaders();
// 从请求头中尝试获取 X-Forwarded-For 字段,这个字段表示客户端经过的代理服务器的IP地址列表,如果有多个代理,以逗号分隔。
String ipAddress = headers.getFirst("X-Forwarded-For");
// 不断尝试获取 IP 地址
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = headers.getFirst("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = headers.getFirst("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddress().getAddress().getHostAddress();
// 如果这个地址是本地回环地址(127.0.0.1或者0:0:0:0:0:0:0:1),则根据网卡获取本机配置的IP地址。
if (ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")) {
try {
InetAddress inet = InetAddress.getLocalHost();
ipAddress = inet.getHostAddress();
} catch (UnknownHostException e) {
log.error("根据网卡获取本机配置的IP异常", e);
}
}
}
// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if (ipAddress != null && ipAddress.indexOf(",") > 0) {
ipAddress = ipAddress.split(",")[0];
}
return ipAddress;
}
}
License:
CC BY 4.0