Spring Boot WebFlux WebFilter 过滤器后处理(请求完成后再处理)

JAVA herman 544浏览

在《Spring Boot WebFlux WebFilter 过滤器》这篇文章中,我写了 webflux 过滤器 WebFilter 的具体用法。但是大家发现这种用法和 struts2、SpringMVC 的用法一致,我现在有一个需求需要对所有请求都正常处理完成后加一个响应参数,或者是打印日志。

虽然我们使用拦截器或者 AOP 也可以实现。但是能不能在过滤器中对特定的请求 URL 起作用,并且在同一个过滤器内完成呢?

答案当然是可以的。如果你熟悉spring reactor3的运算符/算子(operator)就能解决这类问题了。

Spring Boot WebFlux WebFilter 过滤器后处理(请求完成后再处理)

我们先来一段代码:

@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”给你免费下载!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847,QQ3群:187424846。QQ群进群密码:xttblog,想加微信群的朋友,可以微信搜索:xmtxtt,备注:“xttblog”,添加助理微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » Spring Boot WebFlux WebFilter 过滤器后处理(请求完成后再处理)