全局过滤器顺序在局部之后

来源:10-15 进阶:再谈过滤器执行顺序

拼搏的蜗牛

2019-10-10

现象:不进入局部过滤器,就不进入全局过滤器;全局过滤器在局部过滤器后执行。
问题:怎样使全局过滤器不需要先进入局部过滤器

我设置的全局过滤器如下:
` public class GatewayApplication {

public static void main(String[] args) {
    SpringApplication.run(GatewayApplication.class, args);
}

@Bean
@Order(0)
public GlobalFilter filter1() {
    return (exchange, chain) -> {
        log.info("进入全局过期器");
        return chain.filter(exchange);
    };
}

} `
局部过滤器如下:

routes:
  - id: route-query
    uri: lb://user-center
    predicates:
      - Query=test,(ha)+
      - TimeBetween=6:00:00,23:00:00
    filters:
      - PreLog=a,b
写回答

1回答

大目

2019-10-10

好问题。

方法一:

public class PostLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
    public static final Logger log = LoggerFactory.getLogger(PreLogGatewayFilterFactory.class);
    @Override
    public GatewayFilter apply(NameValueConfig config) {
        return ((exchange, chain) -> {
            ServerHttpRequest modifiedRequest = exchange.getRequest()
                    .mutate()
                    .build();
            ServerWebExchange modifiedExchange = exchange.mutate()
                    .request(modifiedRequest)
                    .build();
            return chain.filter(modifiedExchange).then(
                    Mono.fromRunnable(() -> {
                        log.info("请求进来了...{},{}", config.getName(), config.getValue());
                    })
            );
        });
    }
}



方法二:也可以把全局过滤器定义成这样:

 @Bean
    public GlobalFilter filter1() {
        return new T();
    }
class T implements GlobalFilter, Ordered {
    private static final Logger log = LoggerFactory.getLogger(GatewayApplication.class);

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("进入全局过滤器");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -1000;
    }
}

我测试了下,用Order注解貌似无效,但是官方文档又明确表示可以用Order。我认为这是一个bug,已经给官方提出,详见:https://github.com/spring-cloud/spring-cloud-gateway/issues/1341


-------

10.14日更新:

https://github.com/spring-cloud/spring-cloud-gateway/issues/1341

官方已确认

@Bean
@Order(0)
public GlobalFilter filter1() {
   return (exchange, chain) -> {
       log.info("进入全局过期器");
       return chain.filter(exchange);
   };
}

其实并不支持,文档里面这样写是个bug!!!

PR:https://github.com/spring-cloud/spring-cloud-gateway/pull/1350

已经修复了文档的相关bug

2
3
大目
回复
拼搏的蜗牛
您好,这个问题我在我的公众号有详细总结过哈:https://mp.weixin.qq.com/s/koYp6D1uRAMSPziMAQ5-LA 希望对您有参考意义。也欢迎关注我的公众号?
2019-10-13
共3条回复

Spring Cloud Alibaba微服务从入门到进阶

面向未来微服务:熟练掌握Spring Cloud Alibaba

3085 学习 · 1324 问题

查看课程