Spring boot SpringCloudGateway:如何创建过滤器

Spring boot SpringCloudGateway:如何创建过滤器,spring-boot,spring-cloud,spring-cloud-netflix,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-SpringOn

我是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();
}
在研究SpringCloudGateway之前,我还研究了SpringNetflixZuul。我知道在Netflix Zuul中,您可以通过创建一个扩展
ZuFilter
的类来创建过滤器,并将其定义为
pre
post
route

然而,我想知道如何使用SpringCloudGateway创建前/后过滤器

非常感谢您的帮助/建议


谢谢。

这里是Kotlin中的一个简单示例:URI
http://.../customers
映射到从名为
customer
的服务的发现服务(lb=负载平衡)获得的URI,并附加“/”。此外,转发的请求通过附加的头条目得到增强。希望这有帮助

@SpringBootApplication
class Application {
    @Bean
    fun routes(builder: RouteLocatorBuilder) = builder.routes {
        route {
            path("/customers")
            filters {
                setPath("/")
                addRequestHeader("aKey", "aValue")
            }
            uri("lb://customer")
        }
    }
}

我不确定这样做是否正确,因为我也在尝试实现这种行为,我在想,如果这是需要做的事情:

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

public class CustomFilter implements GatewayFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        //code for PRE filter

        Mono<Void> v = chain.filter(exchange);

        //code for POST filter
        return v;
    }
}
导入org.springframework.cloud.gateway.filter.GatewayFilter;
导入org.springframework.cloud.gateway.filter.GatewayFilterChain;
导入org.springframework.web.server.ServerWebExchange;
导入reactor.core.publisher.Mono;
公共类CustomFilter实现GatewayFilter{
@凌驾
公共Mono筛选器(服务器WebExchange exchange、网关筛选器链){
//预滤器代码
Mono v=链式过滤器(交换);
//邮政编码
返回v;
}
}
让我知道这是否对您有效,或者您是否找到了其他解决方案。

对于预筛选,这里是(在调用
chain.filter()之前执行代码):

对于“post”筛选器,下面是(代码在
chain.filter(exchange)中的lambda中运行)。然后()
):

公共类SetStatusGatewayFilterFactory扩展了AbstractGatewayFilterFactory{
@凌驾
公共网关筛选器应用(配置){
最终HttpStatus status=ServerWebExchangeUtils.parse(config.status);
退货(交换、连锁)->{
return chain.filter(exchange).then(Mono.fromRunnable)(()->{
//实际上不需要检查,因为它在setStatusCode中受保护,
//但这是一个很好的例子
如果(!exchange.getResponse().isCommitted()){
setResponseStatus(交换、状态);
}
}));
};
}
}

我想他正在寻找如何创建自定义过滤器也许你可以看看:那是给zuul的,不是gateway@spencergibb如何将过滤器添加到配置或路由定位器中?如果我通过Bean注释将其添加到应用程序配置中,它将永远不会被触发。有人解决了这个问题吗?我找不到如何使用RouteLocatorBuilder将自定义筛选器“注册”到路由。
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());
        };
    }

}
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);
                }
            }));
        };
    }
}