专业编程基础技术教程

网站首页 > 基础教程 正文

《Servlet》第28节:Servlet过滤器的加载顺序和执行顺序

ccvgpt 2024-07-30 20:51:44 基础教程 11 ℃

一个web应用程序中,可以创建多个Servlet过滤器,那么这里就有个问题啦?那么多个过滤器,应该先执行哪个过滤器,后执行哪个过滤器呢???

1.1、过滤器执行顺序

针对多个过滤器的情况下,默认会按照Filter过滤器在web.xml配置文件中的配置顺序来加载和执行。什么意思呢???意思就是说,在web.xml配置文件中,哪个过滤器先定义,那么就先加载那个过滤器,并且就会按照定义的顺序依次执行过滤器。

《Servlet》第28节:Servlet过滤器的加载顺序和执行顺序

多个过滤器的加载和执行顺序如下图所示:

1.2、创建三个过滤器

为了演示多个过滤器的先后加载和执行顺序,我们这里分别创建三个过滤器:FirstFilter、SecondFilter、ThirdFilter。给出FirstFilter过滤器案例代码,其他两个过滤器代码类似,如下所示:

package com.gitcode.filter;

import javax.servlet.*;
import java.io.IOException;

/**
 * @version 1.0.0
 * @Date: 2024/2/19 20:35
 * @Author ZhuYouBin
 * @Description: Servlet过滤器
 */
public class FirstFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("FirstFilter: 执行过滤器的init()初始化方法...");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("FirstFilter: 执行过滤器的doFilter()方法...");
        // 放行过滤器,继续执行后续的过滤器
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        System.out.println("FirstFilter: 执行过滤器的destroy()销毁方法...");
    }
}

1.3、web.xml配置过滤器

在web.xml配置文件中,我们按照FirstFilter、SecondFilter、ThirdFilter三个顺序,依次配置Filter过滤器,如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee">

    <display-name>工程名称</display-name>
    <description>
        工程描述
    </description>

    <!-- 配置Servlet -->
    <servlet>
        <servlet-name>DemoServlet</servlet-name>
        <servlet-class>com.gitcode.servlet.DemoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DemoServlet</servlet-name>
        <url-pattern>/demoServlet</url-pattern>
    </servlet-mapping>

    <!-- 配置过滤器 -->
    <filter>
        <filter-name>FirstFilter</filter-name>
        <filter-class>com.gitcode.filter.FirstFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FirstFilter</filter-name>
        <!-- 拦截 /demoServlet 请求路径 -->
        <url-pattern>/demoServlet</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>SecondFilter</filter-name>
        <filter-class>com.gitcode.filter.SecondFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SecondFilter</filter-name>
        <!-- 拦截 /demoServlet 请求路径 -->
        <url-pattern>/demoServlet</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>ThirdFilter</filter-name>
        <filter-class>com.gitcode.filter.ThirdFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ThirdFilter</filter-name>
        <!-- 拦截 /demoServlet 请求路径 -->
        <url-pattern>/demoServlet</url-pattern>
    </filter-mapping>

</web-app>

启动工程,浏览器访问http://localhost:8080/servlet/demoServlet,查看控制台输出日志:

可以看到,过滤器的加载和执行顺序,是和web.xml配置文件中的配置顺序保持一致的。为了验证一下这个结论,我们可以修改web.xml配置文件中的配置顺序,如下:

<?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"
         metadata-complete="true">

    <display-name>工程名称</display-name>
    <description>
        工程描述
    </description>

    <!-- 配置Servlet -->
    <servlet>
        <servlet-name>DemoServlet</servlet-name>
        <servlet-class>com.gitcode.servlet.DemoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DemoServlet</servlet-name>
        <url-pattern>/demoServlet</url-pattern>
    </servlet-mapping>

    <!-- 配置过滤器 -->
    <filter>
        <filter-name>SecondFilter</filter-name>
        <filter-class>com.gitcode.filter.SecondFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SecondFilter</filter-name>
        <!-- 拦截 /demoServlet 请求路径 -->
        <url-pattern>/demoServlet</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>FirstFilter</filter-name>
        <filter-class>com.gitcode.filter.FirstFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FirstFilter</filter-name>
        <!-- 拦截 /demoServlet 请求路径 -->
        <url-pattern>/demoServlet</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>ThirdFilter</filter-name>
        <filter-class>com.gitcode.filter.ThirdFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ThirdFilter</filter-name>
        <!-- 拦截 /demoServlet 请求路径 -->
        <url-pattern>/demoServlet</url-pattern>
    </filter-mapping>

</web-app>

再次启动工程,控制台查看输出日志:

PS:有没有发现过滤器调用init()方法的顺序没有变化,这是因为Servlet的版本问题,在Servlet 2.5以及更早的版本之前,加载顺序和执行顺序是和web.xml配置顺序一致的,2.5之后的版本加载顺序就不一定,3.0版本开始支持注解方式开发。

今天就到这里,未完待续~~

Tags:

最近发表
标签列表