Java 在Spring云网关中获取真实的客户端IP地址

Java 在Spring云网关中获取真实的客户端IP地址,java,spring,spring-cloud-gateway,Java,Spring,Spring Cloud Gateway,我在SpringCloudGateway(SCG)中实现了速率限制。我用下面的代码获取客户端IP地址 @Component public class RemoteAddressKeyResolver implements KeyResolver { @Override public Mono<String> resolve(ServerWebExchange exchange) { return Mono.just(exchange.getReques

我在SpringCloudGateway(SCG)中实现了速率限制。我用下面的代码获取客户端IP地址

@Component
public class RemoteAddressKeyResolver implements KeyResolver {
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }
}
@组件
公共类RemoteAddressKeyResolver实现KeyResolver{
@凌驾
公共Mono解析(服务器WebExchange){
返回Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
}

我的SCG在一个代理后面,所以它得到的是代理的地址,而不是真正的客户端地址。如何获取真实的客户端地址?

您可以检查您的请求头密钥,如(取决于您的代理设置)

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

getFirst
将返回原始ip

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

我找到了解决办法!。有一个
RemoteAddressResolver
is
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());
    }
}
@组件
公共类RemoteAddressKeyResolver实现KeyResolver{
@凌驾
公共Mono解析(服务器WebExchange){
XForwardedRemoteAddressResolver解析器=XForwardedRemoteAddressResolver.maxTrustedIndex(1);
InetSocketAddress InetSocketAddress=resolver.resolve(交换);
返回Mono.just(inetSocketAddress.getAddress().getHostAddress());
}
}

就这么简单

我的代理添加了X-Forwarded-*头,SCG如何捕获这些头?我发现SCG实现了
XForwardedRemoteAddressResolver
,我如何使用这个解析器?是的,SCG方式