Kevin
Kevin

Reputation: 1569

Get real client IP address in Spring Cloud Gateway

I implement rate limiting in Spring Cloud Gateway (SCG). I get client IP address with below code

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

My SCG is behind a proxy so it gets address of proxy not real client address. How can I get real client address?

Upvotes: 3

Views: 9376

Answers (3)

WENPIN1
WENPIN1

Reputation: 31

    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());
    };

Upvotes: 0

Kevin
Kevin

Reputation: 1569

I found a solution!. There is an implementation of RemoteAddressResolver is XForwardedRemoteAddressResolver. Just use it, don't need to implement logic again.

@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());
    }
}

That's all, so simple!

Upvotes: 4

zhang-yuan
zhang-yuan

Reputation: 448

you could check your request headers key, like X-Forwarded-For (depends on your proxy settings)

The X-Forwarded-For (XFF) header is a de-facto standard header for identifying the originating IP address of a client connecting to a web server through an HTTP proxy or a load balancer.

getFirst will return the origin ip

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

Upvotes: 1

Related Questions