java获取nginx反向代理的客户端真实ip(非服务器ip)

在使用nginx方向代理后

Remote Address代表的就是服务器的ip地址,而不是客户端的ip地址了,想要获取真实ip,就需要在nginx里面配置

worker_processes  1;  events {     worker_connections  1024; }   http {     include       mime.types;     default_type  application/octet-stream;     log_format main '$remote_addr - $http_x_forwarded_for - $http_x_real_ip';     access_log  logs/access.log  main;      sendfile        on;      keepalive_timeout  65; 	 	upstream tomcat_server_pool{          #server 172.17.0.14:3000 weight=10; 	#server 172.17.0.14:3001 weight=10;         server 127.0.0.1:1001 weight=10;      }       server {         listen       80;         server_name  localhost;          location / { 		             proxy_pass http://tomcat_server_pool;               proxy_set_header X-Real-IP $remote_addr;             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;             proxy_set_header Host $http_host;             root   html;             index  index.html index.htm;         }       }    } 

  其中X-Real-IP和X-Forwarded-For都是客户端真实地址

当nginx配置好的后,接下来需要在java中进行获取

 public void login(HttpServletRequest request, Model model) {         String remoteHost = request.getRemoteHost();         String clientIp = request.getHeader(x-forwarded-for);         log.info(clientIp:{},clientIp);         String proxyClientIP = request.getHeader(Proxy-Client-IP);         log.info(proxyClientIP:{},proxyClientIP);          String xRealIP = request.getHeader(X-Real-IP);         log.info(xRealIP:{},xRealIP);          String host = request.getHeader(Host);         log.info(host:{},host);          String remoteAddr = request.getRemoteAddr();         log.info(remoteAddr:{},remoteAddr);           model.addAttribute(year, TimeUtils.getYear());         queryIp.judgeIp(model, remoteHost, request.getLocalAddr());     } 

  结果

 

 

nginx相关命令

/usr/local/webserver/nginx/sbin/nginx -s reload            # 重新载入配置文件 /usr/local/webserver/nginx/sbin/nginx -s reopen            # 重启 Nginx /usr/local/webserver/nginx/sbin/nginx -s stop              # 停止 Nginx