在web开发时有时需要验证用户的真实IP,在Java开发中,使用request.getRemoteAddr()
得到的可能是request路经的代理(Proxy)或者负载平衡器(Load Balancer)的IP,而并非用户的真实IP。一般地,Proxy或者Load Balancer在转发一个请求时,会将原有的IP加在http request的X-FORWARDED-FOR header中,如果该header已经存在,proxy会将收到的IP添加到已有的value中,比如
X-FORWARDED-FOR: 10.4.16.159, 10.4.16.180
如果每个Proxy或Load Balancer都把它们收到的原始IP添加到X-FORWARDED-FOR header中,request的原始IP就是10.4.16.159,而不是request.getRemoteAddr()
得到的IP值。
无疑得到Proxy或者Load Balancer的IP是毫无意义的,那么怎么得到用户的原始IP呢?本文总结出四种方法:
- 配置Apache mod_remoteip模块
- 配置Tomcat RemoteIpValve组件
- 通过Application级别的Filter(比如