写在前面
在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规则配置。