如何在Spring cloud gateway 中获取未填充变量的请求路径(eg: /page/{id})?
问题描述
目前想在 gateway 中根据接口进行限流,即:每个接口都限制为 n 次/秒
问题出现的环境背景及自己尝试过哪些方法
刚开始的时候,想当然就是直接获取 uri,然后发现并不能处理 有 路径变量的接口,例如:/xxx/{id}
,对于这种接口,每传不同的 id,都会被识别为不同的接口。
Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);ServerHttpRequest request = exchange.getRequest();
String uri = request.getURI().getPath();
Mono.just(Optional.ofNullable(route).map(Route::getId).orElse("") + "/" + uri);
想知道有没有好的办法能解决这个问题。
目前 gateway 代码:
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.cloud.gateway.route.Route;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.http.server.reactive.ServerHttpRequest;
import reactor.core.publisher.Mono;
import java.util.Optional;
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
@Bean
public KeyResolver customKeyResolver() {
return exchange -> {
// 获取当前路由
Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
ServerHttpRequest request = exchange.getRequest();
String uri = request.getURI().getPath();
return Mono.just(Optional.ofNullable(route).map(Route::getId).orElse("") + "/" + uri);
};
}
}
回答:
/xxx/{id}传入不同的id,实际上就是不同的接口,如果你想根据/xxx/这个路径进行限流,可以在这个方法加个注解,在限流的逻辑里获取是否有这个注解。也可以修改接口,将id 放入参数。
以上是 如何在Spring cloud gateway 中获取未填充变量的请求路径(eg: /page/{id})? 的全部内容, 来源链接: utcz.com/p/944634.html