问题引出
很多小伙伴在使用nginx代理网关或者其他应用以后,后端服务使用request.getRemoteAddr() 就无法获取到最开始访问的用户IP了,通常获取到的都是网关的IP。
如何解决
这个问题很常见,我们只需要简单的执行以下步骤即可!
在客户端访问服务器的过程中如果需要经过 HTTP 代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的 IP 地址,这个消息首部成为事实上的标准。在消息流从客户端流向服务器的过程中被拦截的情况下,服务器端的访问日志只能记录代理服务器或者负载均衡服务器的 IP 地址。如果想要获得最初发起请求的客户端的 IP 地址的话,那么 X-Forwarded-For 就派上了用场。
首先nginx开启X-Forwarded-For 编辑nginx配置文件server部分
server {
listen 80;
server_name localhost;
location /test {
proxy_pass http://127.0.0.1:8080/hello;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
其中X-Real-IP、X-Real-Port、X-Forwarded-For是需要加在你的项目中的。
然后再去修改SpringGateway网关配置
https://docs.spring.io/spring-cloud-gateway/docs/3.0.8/reference/html/#forwarded-headers-filter
通过网关配置可知,X-Forwarded-For默认开启!
最后后端服务获取就行了
@RestController
public class GatewayTestController {
@RequestMapping("/hello")
public String hello(HttpServletRequest request){
System.out.println(request.getRemoteAddr());
System.out.println(request.getHeader("x-forwarded-for"));
return "ok";
}
}
注意x-forwarded-for字符串包含多个IP,第一个就是我们最开始接入nginx哪个(如果你nginx是最前置)