我是 Spring Cloud Gateway 的新手。
我一直在观看来自 SpringDeveloper channel 的一些 youtube 视频,并且正在研究以下示例:
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/get")
.addRequestHeader("X-SpringOne", "Awesome")
.uri("http://httpbin.org:80"))
.build();
}
在查看 Spring Cloud Gateway 之前,我还查看了 Spring Netflix Zuul。我知道在 Netflix Zuul 中,您可以通过创建一个扩展 ZuulFilter
的类并将其定义为 pre
、post
、路线
等
但是我想知道如何使用 Spring 云网关创建 PRE/POST 过滤器?
非常感谢任何帮助/建议。
谢谢。
最佳答案
这里的前置过滤器是 AddRequestHeader
(代码在 chain.filter()
调用之前执行):
public class AddRequestHeaderGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
@Override
public GatewayFilter apply(NameValueConfig config) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest().mutate()
.header(config.getName(), config.getValue())
.build();
return chain.filter(exchange.mutate().request(request).build());
};
}
}
对于“帖子”过滤器,这里是 SetStatus
(代码在 chain.filter(exchange).then()
的 lambda 中运行):
public class SetStatusGatewayFilterFactory extends AbstractGatewayFilterFactory<SetStatusGatewayFilterFactory.Config> {
@Override
public GatewayFilter apply(Config config) {
final HttpStatus status = ServerWebExchangeUtils.parse(config.status);
return (exchange, chain) -> {
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// check not really needed, since it is guarded in setStatusCode,
// but it's a good example
if (!exchange.getResponse().isCommitted()) {
setResponseStatus(exchange, status);
}
}));
};
}
}
关于spring-boot - Spring Cloud 网关: How to create a filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48520197/