在项目中通常少不了获取客户端请求的ip作为一些安全校验或者日志存储。
其基本逻辑为先取得配置的IP列表,然后通过request.getRemoteAddr()取得客户端的IP地址。
一般情况下,这个是没问题的,但是当使用一些代理软件之后,就获取不到真实的客户端Ip地址。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。
/**
* 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址。
* 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?
* 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串
*
* @param request
* @return
*/
public static String getIpAddress(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
// 如果多级如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串ip值,真正的用户端IP应该是第一个非unknown的有效ip字符串
String[] ipList = ip.split(",");
if (i