全局过滤器顺序在局部之后
来源: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回答
-
好问题。
方法一:
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
232019-10-13
相似问题