被Nginx代理后从REQUEST获取客户端IP地址

应用程序部署上线,一般都会用nginx之类的来进行反向代理,而不是直接访问tomcat之类的容器.

这时候如果用平时的获取ip的代码,就只会获取到nginx所在服务器的ip, 就失去了本身的意义.

今天就来配置下 nginx+tomcat 后,  程序获取ip和 tomcat的访问日志localhost_access_log 获取ip.


nginx+tomcat集群参考以前的博客,这里是传送门


1.首先要在nginx中加个配置,即把用户ip保存下来

在nginx的配置文件中增加 

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. proxy_set_header X-real-ip           $remote_addr;  

位置要注意, 可以放在 location / 中, 如果你配置了.do, .action的转发, 那就要放在 .do,.action的配置中


2.修改程序中获取ip的方法,先取 X-real-ip的值

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. private String getIpAddr(HttpServletRequest request) {  
  2.     String ip = request.getHeader("X-real-ip");//先从nginx自定义配置获取  
  3.     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  4.         ip = request.getHeader("x-forwarded-for");  
  5.     }  
  6.     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  7.         ip = request.getHeader("Proxy-Client-IP");  
  8.     }  
  9.     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  10.         ip = request.getHeader("WL-Proxy-Client-IP");  
  11.     }  
  12.     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  13.         ip = request.getRemoteAddr();  
  14.     }  
  15.     return ip;  
  16. }  


3.修改tomcat的日志配置,记录访问的来源ip

在server.xml中,修改AccessLogValve的配置如下

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
  2.        prefix="localhost_access_log." suffix=".txt"  
  3.        pattern="%{yyyy-MM-dd HH:mm:ss}t %{X-real-ip}i "%r" %s %b %{User-Agent}i" />  

这里修改了时间格式,增加了X-real-ip获取,增加了 User-Agent的记录.

AccessLogValve具体配置参考 http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html#Access_Logging

配置后,打印结果如下



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值