一直以来取客户端的ip使用的是:
getRequest().getRemoteAddr();
在绝大多数情况下,这是可以正确取到客户端的ip的。
昨天服务器改为使用nginx转发后,无法获得到客户端的真实ip,只能取到nginx所以的服的ip。
在网上查询后了角到nginx要设置http header: X-Real-IP才可以取到真实IP。
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
设置之后,果断无效,查询对比多次,配置无误。
最后终于发现:这种情况下,应该改为先取header中的x-real-ip。如果为空的话,再去调用getRemoteAddr();
String realIP = getRequest().getHeader(“X-Real-IP”);
return realIP != null ? realIP : getRequest().getRemoteAddr();
这样似乎解决掉问题了。
但又遇到另一个棘手的事情了。
我们的程序要通过一个统一的nginx进行proxy转发至目标主机,然后在目标主机上再用proxy转发至目标主机tomcat所在端口8080。通过这两次转发后,x-real-ip取到的是第一次进行转发的主机ip,这仍旧不是我们所希望的。
我们所要求的是无论通过直接访问目标主机,还是通过proxy代理访问主机,都希望获得客户端请求的ip,最终解决方案如下:
在统一nginx转发的proxy上配置:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
在目标主机的nginx上proxy配置:
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
修改代码如下:
String address = getRequest().getHeader(“X-Forwarded-For”);
if (address != null && address.length() > 0
&& !”unknown”.equalsIgnoreCase(address)) {
return address;
}
String realIP = getRequest().getHeader(“X-Real-IP”);
return realIP != null ? realIP : getRequest().getRemoteAddr();
呜呼,终于能正确的取到客户端ip了。
0 条评论。