spring-boot - Spring Cloud 网关: How to create a filter

标签 spring-boot spring-cloud spring-cloud-netflix

我是 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 的类并将其定义为 prepost路线

但是我想知道如何使用 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/

相关文章:

Spring Netflix LoadBalancing 规则比较

angular - 如何使用 Spring boot 和 Angular 应用程序隐藏授权 header

java - Spring 数据库初始化仅在应用程序重启后才有效

java-8 - 可以在java 6上运行Spring Cloud吗?

spring - Zuul Ribbon 异常总是返回 500 响应

java - 如何在 application.yml Spring Cloud Gateway 中指定自定义过滤器

java - 根据 en 值在 Spring Boot 中加载 Rabbit 或 IBM mq 配置

spring-boot - @Query 不适用于 QueryDSL 谓词

spring-boot - 来自本地文件系统和 git repo 的 spring cloud 配置属性

spring-cloud-netflix - Springcloud Netflix Feign参数顺序