请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

我设置的全局过滤器如下:
` 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回答

好问题。

方法一:

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 回复 有任何疑惑可以回复我~
  • 提问者 拼搏的蜗牛 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-10-13 11:20:13
  • 提问者 拼搏的蜗牛 #2
    再问一个非相关问题:一个新的技术出来后,老师你是怎么去研究的,会把文档都看一遍吗?我不知怎么着手,只能看别人已经提出的。
    回复 有任何疑惑可以回复我~ 2019-10-13 11:24:20
  • 大目 回复 提问者 拼搏的蜗牛 #3
    您好,这个问题我在我的公众号有详细总结过哈:https://mp.weixin.qq.com/s/koYp6D1uRAMSPziMAQ5-LA
    
    希望对您有参考意义。也欢迎关注我的公众号?
    回复 有任何疑惑可以回复我~ 2019-10-13 12:06:47

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信