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

过滤器的执行顺序

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 后执行

相关文章:

  • Python 字符串正则表达式详解
  • 第 1 章 | 开篇词:Dapp安全 区块链安全 Web3安全 区块链合约一旦部署,安全就是生死线
  • AI加速,制造企业如何用数据驱动质量管理数字化变革?
  • 18 C语言标准头文件
  • Linux 挂载磁盘操作指南
  • React-Router路由跳转、传参、抽象封装以及嵌套路由
  • MySQL - 索引【index】
  • Axure项目实战:智慧城市APP(一)首页(动态面板、拖动效果)
  • 聚水潭商品信息集成MySQL的高效解决方案
  • React 中React.memo的作用,如何利用它进行组件性能优化?
  • Harbor镜像仓库迁移与高可用集群搭建HTTPS实现实战指南
  • 【Python】pillow库学习笔记1-Image类
  • SpringCould微服务架构之Docker(2)
  • 图解预训练模型 ELMo 和 BERT
  • 数据结构十四、哈希表
  • 监控告警+webhook一键部署
  • Json在扩展属性xdata中的应用实例——cad 二次开发c#
  • python每日十题(9)
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(11)
  • AI小白的第七天:必要的数学知识(概率)
  • wordpress 图片分享主题/成都网站关键词推广优化
  • 株洲企业网站建设工作/网站整站优化
  • 内网怎么做网站服务器/实时热搜榜榜单
  • 网站备案没有固定电话/西安seo王尘宇
  • 网站群如何做网站/今天刚刚发生的新闻
  • 静态网站后台/竞价防恶意点击