首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring云网关:如何创建过滤器

Spring云网关:如何创建过滤器
EN

Stack Overflow用户
提问于 2018-01-30 19:23:19
回答 3查看 11K关注 0票数 3

我是spring cloud gateway的新手。

我在SpringDeveloper频道上看了一些youtube的视频,现在正在做下面的例子:

代码语言:javascript
复制
@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的类来创建过滤器,并将其定义为prepostroute等。

然而,我想知道如何使用Spring cloud gateway创建一个PRE/ POST过滤器?

任何帮助/建议都是非常感谢的。

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2018-04-05 01:38:24

对于预过滤器,这里是AddRequestHeader (代码在chain.filter()调用之前执行):

代码语言:javascript
复制
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());
        };
    }

}

对于'post‘过滤器,下面是SetStatus (代码在chain.filter(exchange).then()中以lambda运行):

代码语言:javascript
复制
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);
                }
            }));
        };
    }
}
票数 7
EN

Stack Overflow用户

发布于 2018-01-31 00:25:07

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

代码语言:javascript
复制
@SpringBootApplication
class Application {
    @Bean
    fun routes(builder: RouteLocatorBuilder) = builder.routes {
        route {
            path("/customers")
            filters {
                setPath("/")
                addRequestHeader("aKey", "aValue")
            }
            uri("lb://customer")
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-03-25 06:34:10

我不确定这是不是正确的方法,因为我也在尝试实现这个行为,我在想这是不是需要做的事情:

代码语言:javascript
复制
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;
    }
}

如果这对你有效,或者你找到了另一个解决方案,请告诉我。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48520197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档