一个web应用程序中,可以创建多个Servlet过滤器,那么这里就有个问题啦?那么多个过滤器,应该先执行哪个过滤器,后执行哪个过滤器呢???
1.1、过滤器执行顺序
针对多个过滤器的情况下,默认会按照Filter过滤器在web.xml配置文件中的配置顺序来加载和执行。什么意思呢???意思就是说,在web.xml配置文件中,哪个过滤器先定义,那么就先加载那个过滤器,并且就会按照定义的顺序依次执行过滤器。
多个过滤器的加载和执行顺序如下图所示:
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版本开始支持注解方式开发。
今天就到这里,未完待续~~