nginx负载均衡或代理SpringGateway以后,后台服务如何获取访问IP

问题引出

很多小伙伴在使用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是最前置)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值