SpringBoot中过滤器如何设置执行顺序

1,914 阅读2分钟

这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

写在前面

在SpringBoot项目开发过程中,过滤器的使用是很频繁的,但是在真实的业务场景下,经常会遇到要设置多个过滤器的情况,如此才能将不同的功能抽离开。

比如,认证校验、访问日志存储、参数预处理等一系列的框架操作。

那么遇到这种多个过滤器的情况,SpringBoot是如何来设置每个过滤器的执行顺序呢?这就是我们今天要学习的知识。

SpringBoot如何设置过滤器的执行顺序

其实SpringBoot已经提供了很方便的解决方案,只需要一个注解就可以搞定,那就是@Order(int)注解。

此注解用于修饰类,要起到设置过滤器执行顺序作用的话,还需要和@WebFilter注解配合使用。

接下来,我们来看下具体示例。

现在创建三个过滤器,分别是FirstFilter、SecondFilter、ThirdFilter。下面给出一些核心代码。

FirstFilter

@Order(1)
@WebFilter(urlPatterns = "/", filterName = "FirstFilter")
public class FirstFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("firstFilter已执行。。。。");
        filterChain.doFilter(servletRequest, servletResponse);
    }

}

SecondFilter

@Order(2)
@WebFilter(urlPatterns = "/", filterName = "SecondFilter")
public class SecondFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("secondFilter已执行。。。。");
        filterChain.doFilter(servletRequest, servletResponse);
    }

}

ThirdFilter

@Order(3)
@WebFilter(urlPatterns = "/", filterName = "ThirdFilter")
public class ThirdFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("thirdFilter已执行。。。。");
        filterChain.doFilter(servletRequest, servletResponse);
    }

}

根据以上代码,我们可以得到结果是

firstFilter已执行。。。。
secondFilter已执行。。。。
thirdFilter已执行。。。。

这就是@Order注解和@WebFilter注解结合使用得到的结果,由此可见,SpringBoot中过滤器的执行顺序是可以通过@Order(int)传入是数值定义此过滤器的执行顺序,数字越小越先执行。

注意:@WebFilter注解中还有非常重要的参数,那就是urlPatterns,此参数时用来指定过滤器要过滤的URL规则配置。