ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String ip = request.getHeader("X-Real-IP");
如果controller层没有将request传入进来的话,需要从请求的上下文中获取request请求,
然后获取header中的X-Real-IP字段
如果只有一层代理,则只需要在nginx下增加如下配置即可
location / {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
如果是多层代理,则需要增加多层代理配置
#代理服务器配置
location / {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#nginx服务器配置
location / {
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
#获取客户端IP地址,使用$proxy_add_x_forwarded_for变量
add_header X-Real-IP $proxy_add_x_forwarded_for;
}
首先在第一层nginx上配置 proxy_set_header X-Real-IP $remote_addr;将请求者的真实ip赋给header中的X-Real-IP字段,然后在第二层代理使用
add_header X-Real-IP $proxy_add_x_forwarded_for;将ip赋予X-Real-IP字段