Java 在Spring云网关中获取真实的客户端IP地址
我在SpringCloudGateway(SCG)中实现了速率限制。我用下面的代码获取客户端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
@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
isXForwardedRemoteAddressResolver
的实现。只要使用它,就不需要再次实现逻辑
@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方式