【问题标题】:Execute some logic at the very end in Webflux WebFilter在 Webflux WebFilter 的最后执行一些逻辑
【发布时间】:2020-11-12 13:46:12
【问题描述】:

在传统的 Spring MVC 过滤器中,我可以在 chain.doFilter 之后添加一些代码,以便它们在最后执行。例如:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
   chain.doFilter(request, response);
   A();
}

函数 A 将在所有过滤器和控制器执行后的最后执行,即使在调用 onBeforeCommitResponse 之后也是如此。

我想在 WebFlux WebFilter 中做同样的事情。

public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    return chain.filter(exchange);
    // Call A() after all filters, controllers and after beforeCommit
}

我如何做到这一点?

【问题讨论】:

    标签: spring spring-boot spring-webflux


    【解决方案1】:

    如果您希望在所有过滤器和控制器逻辑完成后执行逻辑,您可以执行以下操作:

    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        return chain.filter(exchange).doFinally(signalType -> {
          //here signalType.toString() is `onComplete`
          System.out.println("After all filters and controller");
          // Call A()
        });
    }
    

    在我的示例代码中使用它,会产生以下日志(我有 3 个网络过滤器):

    2020-07-23 12:35:02.604  INFO c.b.e.i.ImageServiceApplication          :[        ] Starting ImageServiceApplication on in1-1025453mbp with PID 97673 (/Users/Abhi/codes/image-service/out/production/classes started by 1025453 in /Users/Abhi/codes/image-service)
    2020-07-23 12:35:02.606  INFO c.b.e.i.ImageServiceApplication          :[        ] No active profile set, falling back to default profiles: default
    2020-07-23 12:35:04.142  INFO o.s.b.a.e.web.EndpointLinksResolver      :[        ] Exposing 2 endpoint(s) beneath base path '/actuator'
    2020-07-23 12:35:04.461  INFO o.s.b.web.embedded.netty.NettyWebServer  :[        ] Netty started on port(s): 8080
    2020-07-23 12:35:04.479  INFO c.b.e.i.ImageServiceApplication          :[        ] Started ImageServiceApplication in 2.134 seconds (JVM running for 2.767)
    Executing ScopeCheckFilter
    Executing TenancyContextFilter
    Executing ImageSizeCheckFilter
    2020-07-23 12:36:58.267  INFO c.b.e.i.controller.ImageController       :[tenant1] Request received to generate SAS Token
    2020-07-23 12:36:59.722  INFO c.b.e.i.s.a.AzureImageStorageService     :[tenant1] Container exists
    2020-07-23 12:36:59.722  INFO c.b.e.i.s.a.AzureImageStorageService     :[tenant1] Generating SAS Token
    After all filters
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-25
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2019-03-11
      • 1970-01-01
      相关资源
      最近更新 更多