简介:
控制过滤器的执行顺序:<filter-mapping>
<filter-mapping>的配置顺序决定了Filter的执行顺序;
创建两个Servlet:
AServlet:
package demo1;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("------Aervlet 0-----");
System.out.println("------Aervlet 1-----");
}
}
BServlet:
package demo1;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("----------- BServlet 0---------");
req.getRequestDispatcher("/AServlet").forward(req, resp); //转发
System.out.println("----------- BServlet 1---------");
}
}
再创建AFilter和BFilter:
AFilter:
package demoFilter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class AFilter implements Filter {
/**
* 创建之后立即执行,用来做初始化,Filter在服务器启动时就创建
*/
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("AFilter:过滤器出生!");
}
/**
* 每次过滤时都会执行
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("AFilter:拦截成功!");
chain.doFilter(request, response);
System.out.println("AFilter:已放行!");
}
/**
* 销毁之前执行,用来对非内存资源进行释放
*/
public void destroy() {
System.out.println("AFilter:过滤器死亡!");
}
}
BFilter:
package demoFilter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class BFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("BFilter:拦截成功!");
System.out.println("BFilter:已放行!");
}
}
然后进行web.xml的配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
<display-name>day041301</display-name>
<filter>
<filter-name>AFilter</filter-name> <!-- 自定义名称 -->
<filter-class>demoFilter.AFilter</filter-class> <!-- Filter类所在路径 -->
</filter>
<filter>
<filter-name>BFilter</filter-name> <!-- 自定义名称 -->
<filter-class>demoFilter.BFilter</filter-class> <!-- Filter类所在路径 -->
</filter>
<filter-mapping>
<filter-name>BFilter</filter-name> <!-- 自定义名称匹配 -->
<url-pattern>/AServlet</url-pattern> <!-- 拦截的资源路径 -->
</filter-mapping>
<filter-mapping>
<filter-name>AFilter</filter-name> <!-- 自定义名称匹配 -->
<url-pattern>/AServlet</url-pattern> <!-- 拦截的资源路径 -->
</filter-mapping>
</web-app>
现在是BFilter的<filter-mapping>标签在前,拦截顺序应该是BFilter先进行拦截:
浏览器访问AServlet:
查看控制台输出:
果然是BFilter先拦截。
然后将AFIlter放在BFilter前面试试:
先进行拦截的变成了AFilter。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)