Java基础、中级、高级、架构面试资料

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

JAVA herman 17383浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

在《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)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

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