我在(SCG)中实现了速率限制。我获得以下代码的客户端IP地址
@Component
public class RemoteAddressKeyResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
}我的SCG在代理后面,所以它获取代理地址,而不是真正的客户地址。我怎样才能得到真正的客户地址?
发布于 2021-04-09 09:34:21
我找到了解决办法!有一个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());
}
}就这么简单!
发布于 2021-04-09 07:49:04
您可以检查请求头键,如-转发-为 (取决于代理设置)
XFF报头是一个事实上的标准报头,用于识别通过HTTP代理或负载均衡器连接到web服务器的客户端的原始IP地址。
getFirst将返回原始ip
exchange.getRequest().getHeaders().getFirst("X-Forwarded-For")发布于 2021-11-10 10:03:18
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());
};https://stackoverflow.com/questions/67016887
复制相似问题