首页技术文章正文

过滤器链指的是什么?怎样验证过滤器链

更新时间:2023-11-10 来源:黑马程序员 浏览量:

什么是过滤器链呢?所谓过滤器链指的是在一个web应用程序当中,可 以配置多个过滤器,多个过滤器就形成了一个过滤器链。

1699601084533_过滤器链.png

比如:在我们web服务器当中,定义了两个过滤器,这两个过滤器就形成了一个过滤器链。

而这个链上的过滤器在执行的时候会一个一个的执行,会先执行第一个Filter,放行之后再来执行第二 个Filter,如果执行到了最后一个过滤器放行之后,才会访问对应的web资源。

访问完web资源之后,按照我们刚才所介绍的过滤器的执行流程,还会回到过滤器当中来执行过滤器放

行后的逻辑,而在执行放行后的逻辑的时候,顺序是反着的。

先要执行过滤器2放行之后的逻辑,再来执行过滤器1放行之后的逻辑,最后在给浏览器响应数据。以上就是当我们在web应用当中配置了多个过滤器,形成了这样一个过滤器链以及过滤器链的执行顺序。下面我们通过idea来验证下过滤器链。

验证步骤:

1. 在filter包下再来新建一个Filter过滤器类:AbcFilter

2. 在AbcFilter过滤器中编写放行前和放行后逻辑

3. 配置AbcFilter过滤器拦截请求路径为:/*

4. 重启SpringBoot服务,查看DemoFilter、AbcFilter的执行日志

1699601556928_验证步骤.png

AbcFilter过滤器

@WebFilter(urlPatterns = "/*")
public class AbcFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse
response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Abc 拦截到了请求... 放行前逻辑");

        //放行
        chain.doFilter(request,response);

        System.out.println("Abc 拦截到了请求... 放行后逻辑");
    }
}

DemoFilter过滤器

@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain) throws
IOException, ServletException {
        System.out.println("DemoFilter 放行前逻辑.....");

        //放行请求
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("DemoFilter 放行后逻辑.....");
    }
}

打开浏览器访问登录接口:

1699602022570_登录接口.png

通过控制台日志的输出,大家发现AbcFilter先执行DemoFilter后执行,这是为什么呢?

其实是和过滤器的类名有关系。以注解方式配置的Filter过滤器,它的执行优先级是按时过滤器类名的自动排序确定的,类名排名越靠前,优先级越高。

假如我们想让DemoFilter先执行,怎么办呢?答案就是修改类名。

测试:修改AbcFilter类名为XbcFilter,运行程序查看控制台日志

@WebFilter(urlPatterns = "/*")
public class XbcFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse
response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Xbc 拦截到了请求...放行前逻辑");

        //放行
        chain.doFilter(request,response);

        System.out.println("Xbc 拦截到了请求...放行后逻辑");
    }
}

分享到:
在线咨询 我要报名
和我们在线交谈!