背景说明
各位小伙伴大家好,我是全栈小白
相信各位小伙伴都用过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 {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("请求经过过滤器:OneFilter");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public 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、制作不易,一键三连再走吧,您的支持永远是我最大的动力!

本文讨论了在SpringBoot和Zuul网关中,Filter过滤器的执行顺序,着重比较了使用`@WebFilter`注解和web.xml配置的区别,指出后者的执行顺序取决于filter-mapping配置,而前者则按字母顺序执行。
1238

被折叠的 条评论
为什么被折叠?



