背景说明
各位小伙伴大家好,我是全栈小白
相信各位小伙伴都用过Filter过滤器吧,在学习servlet的时候,Filter可是我们认证的好帮手,但是在学习了SpringBoot框架之后,Filter可能被大家遗忘了,相对Spring框架而言,提供的拦截器不管在使用上、功能上都要比过滤器方便很多
最近有小伙伴在使用zuul网关的时候使用到了Filter过滤器,对于执行顺序,还是有必要了解一下
事情是这样的:
有三个Filter过滤器、分别是
UserAuthFilter(用来判断用户是否登录)
XssRouterFilter(用来给不同路由规则封装请求参数)
SensitiveFilter(用来做敏感词的过滤)
项目运行之后,它的执行顺序是这样子的UserAuthFilter->SensitiveFilter->XssRouterFilter
顺序没有问题,符合开发者的预期,但是将XssRouterFilter类名改为AXssRouterFilter顺序竟然发生了变化
经过测试执行顺序是:AXssRouterFilter->UserAuthFilter->SensitiveFilter,这是为什么呢?
言归正传
首先我们了解一下Filter过滤器的两种配置方式
第一:使用@WebFilter注解进行配置
/** @Project:WebFilterCase* @Author:cxs* @Motto:放下杂念,只为迎接明天更好的自己* */
@WebFilter(filterName = "OneFilter", urlPatterns = "/*")
public class OneFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("请求经过过滤器:OneFilter");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}
}
第二种:使用web.xml进行配置
<filter><filter-name>TwoFilter</filter-name><filter-class>com.cxs.filter.TwoFilter</filter-class>
</filter>
<filter-mapping><filter-name>TwoFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
我们先使用方式一配置3个过滤器查看执行流程
我们的预期是OneFilter->TwoFilter->ThreeFilter,但实际是OneFilter->ThreeFilter->TwoFilter
我们使用方式二配置3个过滤器查看执行流程
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.cxs.servlet.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping><filter><filter-name>OneFilter</filter-name><filter-class>com.cxs.filter.OneFilter</filter-class></filter><filter-mapping><filter-name>OneFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>TwoFilter</filter-name><filter-class>com.cxs.filter.TwoFilter</filter-class></filter><filter-mapping><filter-name>TwoFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>ThreeFilter</filter-name><filter-class>com.cxs.filter.ThreeFilter</filter-class></filter><filter-mapping><filter-name>ThreeFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>
我们的预期是OneFilter->TwoFilter->ThreeFilter,实际是OneFilter->TwoFilter->ThreeFilter,与预期一致
总结:
- web.xml中配置的过滤器,这个调用顺序是和Filter的filter-mapping的配置有关,调用顺序从上到下,也就是说上面的配置先于下面的先调用,和filter配置的顺序无关。
- 通过@WebFilter注解进行配置的过滤器,执行顺序会按照字母的顺序执行,暂时无法自定义顺序
结语
1、制作不易,一键三连再走吧,您的支持永远是我最大的动力!