Java获取客户端真实IP
Get the Real IP of Client in Java Server
Java获取客户端真实IP的代码
import javax.servlet.http.HttpServletRequest;
public class IpUtil {
private static final String[] IP_HEADERS_TO_TRY = { // 依次尝试从这些请求头中获取真实IP,按照优先级顺序排列
"X-Forwarded-For", // 代理服务器最常用请求头,格式:client, proxy1, proxy2, proxy3... 以英文逗号和空格分隔
"Proxy-Client-IP", // Apache会用
"WL-Proxy-Client-IP", // WebLogic会用
"HTTP_CLIENT_IP", // 某些代理服务器会用
"HTTP_X_FORWARDED_FOR", // 某些代理服务器会用
"X-Real-IP"// Nginx一般会用
};
/**
* 从HttpServletRequest中获取客户端真实IP
*/
public static String getClientIp(HttpServletRequest request) {
for (String header : IP_HEADERS_TO_TRY) {
String ip = request.getHeader(header);
if (ip != null && !ip.trim().isEmpty() && !"unknown".equalsIgnoreCase(ip.trim())) {
return ip.split(",", 2)[0].trim();
}
}
return request.getRemoteAddr();
}
}
由于代理服务器的广泛应用(例如运营商为客户端提供的网关代理、网站建设者用的反向代理等),客户端的请求在到达后端服务的过程中可能会经过多重转发,因此必须通过一些特殊的请求头才能获取客户端真实IP。
代理服务器设置
为了能通过上述代码获取客户端真实IP,我们在使用代理服务器时,必须配置特定请求头,这样才能让代理服务器转发请求时携带真实的客户端IP。
例如在Nginx中,需要进行以下设置:
server {
listen 80;
server_name example.com;
location /example/ {
proxy_pass http://localhost:8080/;
proxy_set_header Host $host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
注意上面第9~10行,必须让Nginx在转发请求时设置 X-Real-IP
、X-Forwarded-For
等请求头,这样后端服务才能通过上面的Java代码获取客户端真实IP。