问题引出

很多小伙伴在使用nginx代理网关或者其他应用以后,后端服务使用request.getRemoteAddr() 就无法获取到最开始访问的用户IP了,通常获取到的都是网关的IP。

如何解决

这个问题很常见,我们只需要简单的执行以下步骤即可!

X-Forwarded-For - HTTP | MDN (mozilla.org)

 在客户端访问服务器的过程中如果需要经过 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是最前置)

更多推荐