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

在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. 详细执行流程

text 复制代码
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. 关键区别

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

5. 使用场景

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

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

相关推荐
嘻哈∠※2 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_7983 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2583 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
极创信息5 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒6 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
喜欢的名字被抢了6 小时前
程序出问题怎么查,以及如何让它不掉线
java·运维·数据库
数据知道6 小时前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
2601_949950637 小时前
Java 面试准备,用练题簿把“背过八股”变成“真正会答”
java·开发语言·面试·刷题·小程序推荐
Rain的Java大神之路7 小时前
MQ重复消费问题怎么解决
java·经验分享·后端·面试·架构·rabbitmq·rocketmq