Java Spring云网关中的WebFilter问题

Java Spring云网关中的WebFilter问题,java,spring,spring-webflux,spring-cloud-gateway,Java,Spring,Spring Webflux,Spring Cloud Gateway,我在我的环境中使用基于JavaWebFlux的SpringCloudGateway()作为API网关,并且在使用过滤器时感到困惑。目标是一个过滤器,它可以在请求到达服务器时节省时间,并在返回响应时记录持续时间。我的理解是,WebFilter是实现这一点的方法,并添加了一个有时有效但有时无效的方法。在所有情况下,预请求部分都会发生,但它通常不会命中回调 WebFilter如下所示: public Mono<Void> filter(ServerWebExchange exchang

我在我的环境中使用基于JavaWebFlux的SpringCloudGateway()作为API网关,并且在使用过滤器时感到困惑。目标是一个过滤器,它可以在请求到达服务器时节省时间,并在返回响应时记录持续时间。我的理解是,WebFilter是实现这一点的方法,并添加了一个有时有效但有时无效的方法。在所有情况下,预请求部分都会发生,但它通常不会命中回调

WebFilter如下所示:

  public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    var time = System.currentTimeMillis();

    return exchange
      .getPrincipal()
      .flatMap(principal -> {
        return chain.filter(exchange);
      })
      .doAfterSuccessOrError((r, t) -> {
        System.out.println("This frequently doesn't happen");
        var duration = System.currentTimeMillis() - time;
        recordTime(duration);
    });
  }
奇怪的是WebFilter中的
doAfterSuccessOrError
将按预期在proxypath2中执行,但在proxypath1中不会执行。但是,如果我们将
.filters(f->f.filter(baseFilter))
添加到proxypath1中,WebFilter将正常执行。BaseFilter实际上只执行以下操作:

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  return Mono.empty();
}
公共Mono筛选器(服务器WebExchange exchange、网关筛选器链){
返回Mono.empty();
}
有人能帮我理解这种行为吗?我的理解是WebFilter应该始终执行前置和后置部分,我不理解GatewayFilter导致的行为,这使得它在一种情况下运行,而不是在另一种情况下运行

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  return Mono.empty();
}