Spring Cloud Gateway:如何创建过滤器

rm1*_*345 2 spring-boot spring-cloud spring-cloud-netflix

我是Spring Cloud Gateway的新手。

我一直在观看SpringDeveloper频道中的一些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();
}
Run Code Online (Sandbox Code Playgroud)

在研究Spring Cloud Gateway之前,我还研究过Spring Netflix Zuul。据我所知,在Netflix的Zuul,你可以通过创建一个扩展类创建过滤器ZuulFilter,并把它定义为prepostroute,等。

但是我想知道如何使用Spring云网关创建PRE / POST过滤器?

任何帮助/建议深表感谢。

谢谢。

spe*_*ibb 5

对于前置过滤器,这里是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());
        };
    }

}
Run Code Online (Sandbox Code Playgroud)

对于“后置”过滤器,这里是SetStatus(代码在中的lambda中运行chain.filter(exchange).then()):

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);
                }
            }));
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @spencergibb过滤器如何添加到配置或路由定位器?如果我通过Bean批注将其添加到应用程序配置中,则不会触发它。 (4认同)