当前位置: 首页 > article >正文

过滤器的执行顺序

Servlet 过滤器(Filter)的执行顺序

在 Java Web 开发中,多个过滤器(Filter) 可以按照一定的顺序执行,通常由 @WebFilter 注解的 orderweb.xml 配置的 filter-mapping 来控制。

1. 过滤器执行的基本流程

当客户端请求到达服务器时:

  1. 所有匹配的过滤器 会按照优先级依次执行 doFilter() 方法。

  2. 过滤器可以修改请求或响应(如权限验证、日志记录等)。

  3. 调用 chain.doFilter(request, response); 后,请求会继续传递给下一个过滤器或最终的 Servlet 处理。

  4. 当 Servlet 处理完毕后,响应会依次回溯经过过滤器链(执行 doFilter() 方法中的 response 处理部分)。

2. 过滤器的默认执行顺序

如果没有特殊指定,过滤器的执行顺序如下:

  • 按照 @WebFilterweb.xml 配置的顺序执行(从上到下)。

  • 先执行 doFilter(request, response) 之前的代码

  • 请求传递到目标 Servlet 或下一个过滤器

  • Servlet 处理完成后,返回响应时,按照 "栈" 的方式依次执行 doFilter() 之后的代码(即 后进先出)。

示例

假设有 FilterAFilterBFilterC,它们的顺序为:

  1. FilterA

  2. FilterB

  3. FilterC

  4. Servlet 处理请求

  5. 响应回溯FilterC -> FilterB -> FilterA

FilterA → FilterB → FilterC → Servlet 处理 → FilterC 回溯 → FilterB 回溯 → FilterA 回溯

3. 如何控制多个过滤器的执行顺序?

(1)@WebFilter + @Order 控制

在 Spring Boot Servlet 3.0+ 的环境下,可以使用 @Order 注解 来控制执行顺序:

@Order(1)  // 数字越小,优先级越高,最先执行
@WebFilter("/admin/*")
public class AuthFilter implements Filter {
    // 过滤器代码
}
@Order(2)
@WebFilter("/*")
public class LogFilter implements Filter {
    // 记录日志
}

(2)web.xml 配置顺序

web.xml 里,filter-mapping 出现的顺序决定了执行顺序

<filter>
    <filter-name>AuthFilter</filter-name>
    <filter-class>com.example.AuthFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>AuthFilter</filter-name>
    <url-pattern>/admin/*</url-pattern>
</filter-mapping>

<filter>
    <filter-name>LogFilter</filter-name>
    <filter-class>com.example.LogFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>LogFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

在这个例子中:

  1. AuthFilter 先执行(因为它的 filter-mapping 先出现)。

  2. LogFilter 后执行


http://www.kler.cn/a/596334.html

相关文章:

  • Go语言常用框架及工具介绍
  • 汽车免拆诊断案例 | 2024 款路虎发现运动版车无法正常识别智能钥匙
  • 八股Spring
  • 适合用户快速开发项目的PHP框架有哪些?
  • SAP-ABAP:SAP生产业务(PP模块)全流程深度解析
  • Spring Boot02(数据库、Redis)02---java八股
  • yolo模型学习笔记——3——yolov3相比与yolov2的优点
  • 蓝桥杯12届 货物摆放
  • UE AI 模型自动生成导入场景中
  • 【后端开发面试题】每日 3 题(十八)
  • Windows系统提权
  • Linux | 安装 Samba将ubuntu 的存储空间指定为windows 上的一个磁盘
  • leetcode日记(109)两数之和
  • 回调方法传参汇总
  • Python 网页爬取入门指南
  • 机器学习——KNN数据集划分
  • VBA-Excel
  • centos中anconda的一些操作
  • 记录一次Kafka重复消费的问题
  • 如何在百度搜索上删除与自己名字相关的资料