|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
欢迎大家来到仓酷云论坛!在Linux情况下,使用了Nginx的强势―反向代办署理,了局招致用request.getRemoteAddr()猎取的IP均为公司的代办署理办事器的IP,日记纪录严峻禁绝确!
人人都晓得在办事器端猎取客户真个IP地点的***是:request.getRemoteAddr(),这类***在年夜局部情形下都是无效的。
可是在经由过程了Nginx,Squid等反向代办署理软件就不克不及猎取到客户真个实在IP地点了。
假如利用了反向代办署理软件,比方将http://192.168.101.88:80/的URL反向代办署理为http://pay.kedou.com/的URL时,用request.getRemoteAddr()***猎取的IP地点是:127.0.0.1 或 192.168.101.88,而并非客户真个实在IP。
本来是client端间接哀求办事端,走A线路哀求,这时候候经由过程request.getRemoteAddr()***能够筹办的猎取客户真个IP。可是做了代办署理以后呢,client端不是间接哀求办事端,而是走B线路哀求代办署理办事器,由代办署理器往哀求办事端,这时候候办事端经由过程request.getRemoteAddr()***拿到的天经地义是
代办署理办事器的地点了。
经由代办署理今后,因为在客户端和办事之间增添了两头层,因而办事器没法间接拿到客户真个IP,办事器端使用也没法间接经由过程转发哀求的地点前往给客户端。可是在转发哀求的HTTP头信息中,增添了X-FORWARDED-FOR信息。用以跟踪原本的客户端IP地点和本来客户端哀求的办事器地点。当我们会见http://pay.kedou.comindex.htm/时,实在并非我们扫瞄器真正会见到了办事器上的index.htm/文件,而是先由代办署理办事器往会见http://192.168.101.88:80/index.htm,代办署理办事器再将会见到的了局前往给我们的扫瞄器,由于是代办署理办事器往会见index.htm的,以是index.htm中经由过程request.getRemoteAddr()的***猎取的IP实践上是代办署理办事器的地点,并非客户真个IP地点。
因而可得出取得客户端实在IP地点的
- ***一: publicStringgetRemortIP(HttpServletRequestrequest){if(request.getHeader(”x-forwarded-for”)==null){returnrequest.getRemoteAddr(); }returnrequest.getHeader(”x-forwarded-for”); 但是当我会见http://pay.kedou.comindex.htm/时,前往的IP地点一直是unknown,也并非如上所示的127.0.0.1 或 192.168.101.88了因而可得出取得客户端实在IP地点的
复制代码
- ***二: publicStringgetIpAddr(HttpServletRequestrequest){ Stringip=request.getHeader(”x-forwarded-for”); if(ip==null||ip.length()==0||”unknown”.equalsIgnoreCase(ip)){ ip=request.getHeader(”Proxy-Client-IP”); }if(ip==null||ip.length()==0||”unknown”.equalsIgnoreCase(ip)){ ip=request.getHeader(”WL-Proxy-Client-IP”); }if(ip==null||ip.length()==0||”unknown”.equalsIgnoreCase(ip)){ ip=request.getRemoteAddr(); }returnip; }
复制代码
但是,假如经由过程了多级反向代办署理的话,X-Forwarded-For的值其实不止一个,而是一串Ip值,事实哪一个才是真实的用户真个实在IP呢?
谜底是取X-Forwarded-For中第一个非unknown的无效IP字符串。
如:
X-Forwarded-For:192.168.101.88,192.168.101.128,192.168.101.126
- 用户实在IP为:192.168.101.88 因而猎取终极版代码 //猎取客户端IP地点,撑持代办署理办事器 publicstaticStringgetIpAddress(HttpServletRequestrequest){ Stringip=request.getHeader("x-forwarded-for"); StringlocalIP="127.0.0.1"; if((ip==null)||(ip.length()==0)||(ip.equalsIgnoreCase(localIP))||"unknown".equalsIgnoreCase(ip)){ ip=request.getHeader("Proxy-Client-IP"); }if((ip==null)||(ip.length()==0)||(ip.equalsIgnoreCase(localIP))||"unknown".equalsIgnoreCase(ip)){ ip=request.getHeader("WL-Proxy-Client-IP"); }if((ip==null)||(ip.length()==0)||(ip.equalsIgnoreCase(localIP))||"unknown".equalsIgnoreCase(ip)){ ip=request.getRemoteAddr(); }returnip; }
复制代码
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们! |
|