Spring MVC 多个拦截器的执行顺序

一、流程总览

该流程图描述了一个多层拦截器链的业务处理流程,核心逻辑为:

  1. 前置拦截:通过 predHandler1predHandler2 逐层校验请求合法性。
  2. 核心处理:通过校验后执行核心业务逻辑 handler()
  3. 后置处理与清理:按反向顺序执行后置操作,最终完成资源释放。

二、模块功能与业务场景
1. 前置拦截模块
  • predHandler1()
    • 业务作用:执行第一层基础校验(如用户身份验证、请求合法性检查)。
    • 逻辑分支
      • **返回 **false:请求非法或校验失败,直接终止流程(如用户未登录时返回401错误)。
      • **返回 **true:进入下一层校验 predHandler2()
  • predHandler2()
    • 业务作用:执行第二层精细化校验(如权限校验、参数合规性验证)。
    • 逻辑分支
      • **返回 **false:校验失败,仅触发 afterCompletion1()(如记录失败日志),流程终止。
      • **返回 **true:进入核心业务处理 handler()

2. 核心业务模块
  • handler()
    • 业务作用:执行实际业务逻辑(如数据计算、数据库操作、服务调用)。
    • 触发条件:所有前置拦截器均通过(predHandler1predHandler2 均返回 true)。

3. 后置处理模块
  • postHandler2()
    • 业务作用:内层后置操作(如修改响应数据、记录操作日志)。
    • 执行顺序:优先于外层后置操作(postHandler1()),确保依赖资源可用。
  • postHandler1()
    • 业务作用:外层后置操作(如统计请求耗时、格式化最终响应)。

4. 完成清理模块
  • afterCompletion1()
    • 业务作用:外层资源释放(如关闭数据库连接、清理临时文件)。
    • 触发条件:只要 predHandler1 返回 true,无论后续流程是否成功,均会执行。
  • afterCompletion2()
    • 业务作用:内层资源释放(如提交事务、关闭内层连接)。
    • 触发条件predHandler2 返回 true 且流程执行到 handler() 后。

三、流程分支详解
分支 1:predHandler1** 返回 **false
  • 路径predHandler1 → 直接响应
  • 业务意义:基础校验失败,无需后续处理(如用户未登录时直接拒绝请求)。
分支 2:predHandler2** 返回 **false
  • 路径predHandler1 → predHandler2 → afterCompletion1
  • 业务意义:精细化校验失败(如用户无权限),但需释放外层资源(如记录失败日志)。
分支 3:所有拦截通过
  • 路径predHandler1 → predHandler2 → handler → postHandler2 → postHandler1 → afterCompletion2
  • 业务意义:完整处理请求,按反向顺序释放资源(如先提交事务,再关闭连接)。

四、流程设计的关键逻辑
  1. 前置顺序正向,后置顺序反向
    • 前置链:由外到内逐层校验(predHandler1 → predHandler2),确保基础条件优先验证。
    • 后置链:由内到外反向执行(postHandler2 → postHandler1),避免依赖资源提前释放。
  2. 资源释放的精准性
    • 外层资源(如数据库连接)在 afterCompletion1 释放。
    • 内层资源(如事务)在 afterCompletion2 释放,确保提交事务后再关闭连接。

五、实际应用场景
  1. API 请求校验链
    • predHandler1:验证 Token 有效性 → predHandler2:校验用户角色权限 → handler:返回数据。
    • 若角色权限不足,记录日志(afterCompletion1)并终止流程。
  2. 事务管理流程
    • predHandler1:打开数据库连接 → predHandler2:开启事务 → handler:执行业务 SQL。
    • postHandler2:提交事务 → postHandler1:关闭连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django filter 排除字段

在Django中,当你使用filter查询集(QuerySet)时,通常你会根据模型的字段来过滤数据。但是,有时你可能想要排除某些特定的字段,而不是过滤这些字段。这里有几种方法可以实现这一点: 使用exclude方…

ByeCode,AI无代码开发平台,拖拽式操作构建应用

ByeCode是什么 ByeCode 是一款先进的 AI 无代码平台,旨在帮助企业迅速创建数字名片、网站、小程序、应用程序及内部管理系统,无需繁杂的编码或开发工作。ByeCode 采用直观的可视化界面和拖拽式操作,使得非技术用户能够轻松上手。同时&#x…

AI日报 - 2025年04月28日

🌟 今日概览(60秒速览) ▎🤖 能力进展 | Gemini 2.5 Pro成功挑战《口袋妖怪红》8道馆;AI推理器具备自我纠错能力;LLM在游戏、多模态理解、代码迁移等方面展现新能力。 ▎💼 商业动向 | Google回应DOJ反垄断案&#xff…

在Java中实现List按自定义顺序排序的几种方案

在Java中实现List按自定义顺序排序的几种方案 在实际开发中&#xff0c;我们经常需要对集合中的对象按照特定字段进行排序。当排序规则不是简单的字母或数字顺序&#xff0c;而是自定义的顺序时&#xff0c;我们需要采用特殊的方法。本文将以一个List<Person>按省份特定…

微服务架构在云原生后端的深度融合与实践路径

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:后端架构的演变,走向云原生与微服务融合 过去十余年,后端架构经历了从单体应用(Monolithic)、垂直切分(Modularization)、到微服务(Microservices)的演进,每一次变化都是为了解决…

Python中的Walrus运算符分析

Python中的Walrus运算符&#xff08;:&#xff09;是Python 3.8引入的一个新特性&#xff0c;允许在表达式中同时赋值和返回值。它的核心作用是减少重复计算&#xff0c;提升代码简洁性。以下是其适用的典型场景及示例&#xff1a; 1. 在循环中避免重复计算 当循环条件需要多次…

用Node.js施展文档比对魔法:轻松实现Word文档差异比较小工具,实现Word差异高亮标注(附完整实战代码)

引言&#xff1a;当「找不同」遇上程序员的智慧 你是否经历过这样的场景&#xff1f; 法务同事发来合同第8版修改版&#xff0c;却说不清改了哪里 导师在论文修改稿里标注了十几处调整&#xff0c;需要逐一核对 团队协作文档频繁更新&#xff0c;版本差异让人眼花缭乱 传统…

前端浏览器窗口交互完全指南:从基础操作到高级控制

浏览器窗口交互是前端开发中构建复杂Web应用的核心能力&#xff0c;本文深入探讨23种关键交互技术&#xff0c;涵盖从传统API到最新的W3C提案&#xff0c;助您掌握跨窗口、跨标签页的完整控制方案。 一、基础窗口操作体系 1.1 窗口创建与控制 // 新窗口创建&#xff08;现代浏…

Git和Gitlab的部署和操作

一。GIT的基本操作 1.GIT的操作和查看内容 [rootmaster ~]# yum install git -y [rootmaster ~]# git config --list&#xff1a;查看所有配置 2.GIT仓库初始化 [rootmaster ~]# mkdir /gittest&#xff1a;创建目录 [rootmaster ~]# cd /gittest/&#xff1a;进入目录 [rootm…

Linux中线程池的简单实现 -- 线程安全的日志模块,策略模式,线程池的封装设计,单例模式,饿汉式单例模式,懒汉式单例模式

目录 1. 对线程池的理解 1.1 基本概念 1.2 工作原理 1.3 线程池的优点 2. 日志与策略模式 2.1 日志认识 2.2 策略模式 2.2.1 策略模式的概念 2.2.2 工作原理 2.2 自定义日志系统的实现 3. 线程池设计 3.1 简单线程池的设计 3.2 线程安全的单例模式线程池的设计 3…

量子力学:量子通信

量子通信是利用量子力学原理对信息进行编码、传输和处理的新型通信方式&#xff0c;以下是其详细介绍及业界发展现状&#xff1a; 基本原理 量子叠加态 &#xff1a;量子系统可以处于多个状态的叠加&#xff0c;如光子的偏振方向可以同时处于水平和垂直方向的叠加态&#xff…

企业架构之旅(1):TOGAF 基础入门

大家好&#xff0c;我是沛哥儿。今天我们简单聊下TOGAF哈。 文章目录 一、TOGAF 是什么定义与核心定位发展历程与行业地位与其他架构框架的区别 二、TOGAF 核心价值企业数字化转型助力业务与 IT 的协同作用降本增效与风险管控 三、TOGAF 基础术语解析架构域&#xff08;业务、…

CSS 内容超出显示省略号

CSS 内容超出显示省略号 文章目录 CSS 内容超出显示省略号**1. 单行文本省略&#xff08;常用&#xff09;****2. 多行文本省略&#xff08;如 2 行&#xff09;****3. 对非块级元素生效****完整示例****注意事项** 在 CSS 中实现内容超出显示省略号&#xff0c;主要通过控制文…

路由器重分发(OSPF+RIP),RIP充当翻译官,OSPF充当翻译官

路由器重分发&#xff08;OSPFRIP&#xff09; 版本 1 RIP充当翻译官 OSPF路由器只会OSPF语言&#xff1b;RIP路由器充当翻译官就要会OSPF语言和RIP语言&#xff1b;则在RIP中还需要将OSPF翻译成RIPOSPF 把RIP路由器当成翻译官&#xff0c;OSPF路由器就只需要宣告自己的ip&am…

AlexNet网络搭建

AlexNet网络模型搭建 环境准备 首先在某个盘符下创建一个文件夹&#xff0c;就叫AlexNet吧&#xff0c;用来存放源代码。 然后新建一个python文件&#xff0c;就叫plot.py吧&#xff0c;往里面写入以下代码&#xff0c;用于下载数据集&#xff1a; # FashionMNIST里面包含了…

【计算机网络】网络基础概念

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 这是博主计算机网络的第一篇文章&#xff0c;本文由于是基础概念了解&#xff0c;引用了大…

在Spring Boot项目中实现Word转PDF并预览

在Spring Boot项目中实现Word转PDF并进行前端网页预览&#xff0c;你可以使用Apache POI来读取Word文件&#xff0c;iText或Apache PDFBox来生成PDF文件&#xff0c;然后通过Spring Boot控制器提供文件下载或预览链接。以下是一个示例实现步骤和代码&#xff1a; 1. 添加依赖 …

图解 Redis 事务 ACID特性 |源码解析|EXEC、WATCH、QUEUE

写在前面 Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务功能。Redis的事务是将多个命令请求打包&#xff0c;然后一次性、按照顺序的执行多个命令的机制&#xff0c;并且在事务执行期间&#xff0c;服务器不会中断事务而该去执行其他客户端的命令请求。 就像下面这样&#…

LeetCode --- 446 周赛

题目列表 3522. 执行指令后的得分 3523. 非递减数组的最大长度 3524. 求出数组的 X 值 I 3525. 求出数组的 X 值 II 一、执行指令后的得分 照着题目要求进行模拟即可&#xff0c;代码如下 // C class Solution { public:long long calculateScore(vector<string>&…

山东大学软件学院项目实训-基于大模型的模拟面试系统-前端美化滚动条问题

模拟面试界面左侧底部 通过检查工具定位到其所在的位置&#xff1a; 直接对该组件进行美化&#xff1a; <!-- AI面试官列表 --><div class"ai-interviewer-section" v-show"activeTab interviewer"><el-scrollbar class"no-horizont…