使用Nginx等反向代理时如何从Request中获取客户端真实IP地址

在Java Web项目中,若想获取客户端的IP地址,最简单的方式便是使用HttpServletRequest中的getRemoteAddr()方法。但若使用该方法进行获取,一旦项目经过了反向代理(如Nginx),则获取到的IP地址是反向代理服务器的IP地址,而非客户端的真实IP地址。

在使用Nginx做反向代理的情况下,若想获取到客户端的真实IP地址,首先要保证Nginx的配置文件中有proxy_set_header X-Real-IP $remote_addr; 这一句。然后使用HttpServletRequest中的getHeader("X-Real-IP")方法,获取HTTP请求头中"X-Real-IP"中的内容,该内容即为客户端的真实IP地址。

代码样例如下:

// 访问者的IP地址(若未经过反向代理,则该地址为真实的访问者IP地址,否则为反向代理服务器的IP地址)
String customerIp = httpServletRequest.getRemoteAddr();
// 访问者的真实IP地址(若经过反向代理,则该地址为真实的访问者IP地址,否则为空)
String xRealIp = httpServletRequest.getHeader("X-Real-IP");
// 若存在X-Real-IP,则用X-Real-IP作为访问者的IP地址
if (xRealIp != null && !"".equals(xRealIp)) {
 customerIp = xRealIp;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注