【问题标题】:Get real client IP address in Spring Cloud Gateway在 Spring Cloud Gateway 中获取真实的客户端 IP 地址
【发布时间】:2021-07-05 02:02:12
【问题描述】:

我在 Spring Cloud Gateway (SCG) 中实现了速率限制。我使用以下代码获取客户端 IP 地址

@Component
public class RemoteAddressKeyResolver implements KeyResolver {
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }
}

我的 SCG 在代理后面,因此它获取代理地址而不是真实客户端地址。如何获取真实的客户地址?

【问题讨论】:

  • 我的代理添加了 X-Forwarded-* 标头,SCG 如何捕获这些标头?

标签: java spring spring-cloud-gateway


【解决方案1】:
    return exchange -> {
        // String origin = exchange.getRequest().getHeaders().getFirst("X-Forwarded-For");
        // if (origin == null) 
        // origin = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
        // return Mono.just(origin);
        XForwardedRemoteAddressResolver resolver = XForwardedRemoteAddressResolver.maxTrustedIndex(1);
        InetSocketAddress inetSocketAddress = resolver.resolve(exchange);
        logger.trace("inetSocketAddress {}", inetSocketAddress);
        logger.trace(".getHostName() {}", inetSocketAddress.getHostName());
        return Mono.just(inetSocketAddress.getHostName());
    };

【讨论】:

    【解决方案2】:

    我找到了解决方案! RemoteAddressResolver 的实现是XForwardedRemoteAddressResolver。直接用就行了,不用再去实现逻辑了。

    @Component
    public class RemoteAddressKeyResolver implements KeyResolver {
        @Override
        public Mono<String> resolve(ServerWebExchange exchange) {
            XForwardedRemoteAddressResolver resolver = XForwardedRemoteAddressResolver.maxTrustedIndex(1);
            InetSocketAddress inetSocketAddress = resolver.resolve(exchange);
            return Mono.just(inetSocketAddress.getAddress().getHostAddress());
        }
    }
    

    就是这么简单!

    【讨论】:

      【解决方案3】:

      您可以检查您的请求标头键,例如 X-Forwarded-For(取决于您的代理设置)

      X-Forwarded-For (XFF) 标头是事实上的标准标头,用于识别通过 HTTP 代理或负载平衡器连接到 Web 服务器的客户端的原始 IP 地址。

      getFirst 将返回源 ip

      exchange.getRequest().getHeaders().getFirst("X-Forwarded-For")
      

      【讨论】:

      • 我发现SCG实现了XForwardedRemoteAddressResolver,我该如何使用这个解析器?
      猜你喜欢
      • 2013-08-18
      • 2022-07-28
      • 2015-10-18
      • 2011-09-02
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      相关资源
      最近更新 更多