在Webflux WebFilter的最后执行一些逻辑

use*_*406 7 spring spring-boot spring-webflux

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

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
   chain.doFilter(request, response);
   A();
}
Run Code Online (Sandbox Code Playgroud)

该函数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
}
Run Code Online (Sandbox Code Playgroud)

我该如何实现这一目标?

Abh*_*rty 6

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

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()
    });
}
Run Code Online (Sandbox Code Playgroud)

在我的示例代码中使用它会生成以下日志(我有 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
Run Code Online (Sandbox Code Playgroud)