在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; }