在《Spring Boot WebFlux WebFilter 过滤器》这篇文章中,我写了 webflux 过滤器 WebFilter 的具体用法。但是大家发现这种用法和 struts2、SpringMVC 的用法一致,我现在有一个需求需要对所有请求都正常处理完成后加一个响应参数,或者是打印日志。
虽然我们使用拦截器或者 AOP 也可以实现。但是能不能在过滤器中对特定的请求 URL 起作用,并且在同一个过滤器内完成呢?
答案当然是可以的。如果你熟悉spring reactor3的运算符/算子(operator)就能解决这类问题了。
我们先来一段代码:
@Configuration public class PostProcessingFilter implements WebFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { //后处理,打印完成信号的值 return chain.filter(exchange).doFinally(signal -> System.out.println("signal="+signal.toString())); /* 其他几种 * or 1: 建议尽量采用链式的fluent连贯写法 * Mono<Void> completeMono = chain.filter(exchange); * return completeMono.doFinally(signal -> System.out.println("signal="+signal.toString())); */ //or 2: return chain.filter(exchange).thenEmpty(other); //or 3: return chain.filter(exchange).thenMany(other).map(..)....then(); } }
上面的代码中,我们在 WebFilterChain 的 filter 方法后面加入了部分逻辑处理。filter 方法后面可以接doFinally、then、thenEmpty、thenMany、map、flatMap等用法。只要保证这些链式用法后面最终返回 Mono<Void> 即可。
这就是 WebFlux 的魅力之一。现在你明白响应式编程,或反应式编程的流行趋势和意义了吗?
好了,不扯了,源码同样的在我的公众号里面,回复“webflux”给你免费下载!
: » Spring Boot WebFlux WebFilter 过滤器后处理(请求完成后再处理)
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/251883.html