面试官:说一下Filter过滤器的执行顺序

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

背景说明

各位小伙伴大家好,我是全栈小白

相信各位小伙伴都用过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个过滤器查看执行流程

image-20240229163757360

我们的预期是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>

image-20240229164133387

我们的预期是OneFilter->TwoFilter->ThreeFilter,实际是OneFilter->TwoFilter->ThreeFilter,与预期一致

总结:

  • web.xml中配置的过滤器,这个调用顺序是和Filter的filter-mapping的配置有关,调用顺序从上到下,也就是说上面的配置先于下面的先调用,和filter配置的顺序无关。
  • 通过@WebFilter注解进行配置的过滤器,执行顺序会按照字母的顺序执行,暂时无法自定义顺序

结语

1、制作不易,一键三连再走吧,您的支持永远是我最大的动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈小白.

感谢老板,祝老板今年发大财!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值