再论Spring MVC中Filter和HandlerInterceptor的优先级

ops/2025/2/28 23:14:31/

在Spring MVC中,Filter和HandlerInterceptor的执行顺序及优先级如下:


1. 执行顺序与优先级

  • Filter(Servlet规范)的优先级高于 HandlerInterceptor(Spring MVC框架)。

  • 请求处理流程

    1. Filter链:所有配置的Filter按顺序处理请求(在请求进入DispatcherServlet之前)。
    2. DispatcherServlet:请求到达Spring MVC核心控制器。
    3. HandlerInterceptor:通过preHandle方法介入请求(在Controller方法调用前)。
  • 响应处理流程

    1. HandlerInterceptorpostHandle(Controller执行后,视图渲染前)和afterCompletion(请求完全结束后)。
    2. Filter链:按逆序处理响应(从最后一个Filter回到第一个)。

2. 详细执行流程

HTTP请求→ Filter1 → Filter2 → ... → FilterN→ DispatcherServlet→ HandlerInterceptor1.preHandle()→ HandlerInterceptor2.preHandle()→ Controller方法→ HandlerInterceptor2.postHandle()→ HandlerInterceptor1.postHandle()→ 视图渲染(如存在)→ HandlerInterceptor2.afterCompletion()→ HandlerInterceptor1.afterCompletion()← FilterN处理响应(逆序) ← ... ← Filter1处理响应

3. 配置顺序的影响

  • Filter顺序
    • web.xml中按配置顺序执行(或通过FilterRegistrationBeanorder属性)。
  • HandlerInterceptor顺序
    • 通过InterceptorRegistry添加的顺序决定:
      • preHandle:按注册顺序执行。
      • postHandleafterCompletion:按注册逆序执行。

4. 关键区别

特性FilterHandlerInterceptor
规范/框架Servlet规范Spring MVC框架
作用范围所有请求(包括静态资源)Spring管理的Controller请求
访问Spring上下文无法直接访问可以直接访问Spring Bean
控制粒度更底层(请求/响应预处理)更贴近业务逻辑(如Controller前后处理)

5. 使用场景

  • Filter:处理与业务无关的通用逻辑(如编码设置、日志记录、跨域处理)。
  • HandlerInterceptor:处理与业务相关的逻辑(如权限校验、参数预处理)。

通过理解两者的优先级和执行顺序,可以更灵活地设计请求处理逻辑。


http://www.ppmy.cn/ops/162077.html

相关文章

minio作为K8S后端存储

docker部署minio mkdir -p /minio/datadocker run -d \-p 9000:9000 \-p 9001:9001 \--name minio \-v /minio/data:/data \-e "MINIO_ROOT_USERjbk" \-e "MINIO_ROOT_PASSWORDjbjbjb123" \quay.io/minio/minio server /data --console-address ":90…

DeepSeek-R1:通过强化学习激发大语言模型的推理能力

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列三DeepSeek大模型技术系列三》DeepSeek-…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.1.2典型应用场景:日志分析、实时搜索、推荐系统

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 为什么选择Elasticsearch?——典型应用场景深度解析1. 引言2. 日志分析:海量数据的实时洞察2.1 行业痛点2.2 ES解决方案关键技术实现: 2.…

Android之APP更新(通过接口更新)

文章目录 前言一、效果图二、实现步骤1.AndroidManifest权限申请2.activity实现3.有版本更新弹框UpdateappUtilDialog4.下载弹框DownloadAppUtils5.弹框背景图 总结 前言 对于做Android的朋友来说,APP更新功能再常见不过了,因为平台更新审核时间较长&am…

Ubuntu指令(一)

一、终端操作指令 打开终端,有两种便捷方式: 直接点击系统中的终端按钮;使用快捷键ctrl alt T。 关闭终端,同样有多种选择: 在终端输入exit指令;使用快捷键ctrl d;直接点击终端窗口的关闭…

计算机毕业设计 ——jspssm508Springboot 的旅游管理

📘 博主小档案: 花花,一名来自世界500强的资深程序猿,毕业于国内知名985高校。 🔧 技术专长: 花花在深度学习任务中展现出卓越的能力,包括但不限于java、python等技术。近年来,花花更…

qt 如何做到checkbox中的状态和定义的变量同步绑定

在 Qt 中实现 QCheckBox 的状态与变量同步绑定,可以通过 信号槽机制 和 数据更新逻辑 实现双向同步。以下是详细步骤和示例: 核心思路 复选框状态变化 → 变量更新 通过 QCheckBox::stateChanged 信号触发槽函数,更新变量。 变量更新 → 复选…

Python网络安全脚本

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 前言 睡不着,那就起来学习其实base64模块很早之前用过今天做爬虫的时候有个URL需要用它来编码一下 所以百度又学了一下遇到最大的问题就是python3和p…