在 Spring Boot 中,过滤器(Filter)和拦截器(Interceptor) 是两种常见的请求处理机制,它们在请求生命周期中的执行顺序如下:
1. 先后顺序(请求 & 响应流)
(1)请求进入顺序
-
过滤器(Filter)
- 由 Servlet 容器 负责执行,比 Spring 更早,可用于全局请求处理。
- 典型应用:请求日志、权限校验、编码设置、跨域处理、CSRF 过滤等。
- 执行
doFilter()方法,可对请求进行修改、放行或拦截。
-
拦截器(Interceptor)
- 由 Spring MVC 框架管理,在 Handler(Controller)执行前、执行后、视图渲染前都可以介入。
- 典型应用:用户身份认证、权限验证、日志记录、数据处理等。
- 主要执行:
preHandle()(Controller 方法执行前)postHandle()(Controller 方法执行后,但视图未渲染)afterCompletion()(整个请求完成后,适用于资源清理)
-
控制器(Controller)
- 经过过滤器和拦截器后,请求最终到达 Spring MVC 的
@Controller处理请求。
- 经过过滤器和拦截器后,请求最终到达 Spring MVC 的
(2)响应返回顺序
请求处理完成后,响应的流转顺序与请求相反:
-
拦截器(Interceptor)
- 先执行
postHandle()(Controller 处理后,但视图未渲染) - 再执行
afterCompletion()(请求完全结束,可清理资源)
- 先执行
-
过滤器(Filter)
- 过滤器的
doFilter()方法在请求处理完毕后,执行 回溯逻辑,可用于响应头设置、日志记录、缓存控制等。
- 过滤器的
2. 总结执行顺序
请求进入
过滤器 Filter → 拦截器 preHandle → Controller 方法执行
响应返回
Controller 方法执行完成 → 拦截器 postHandle → 拦截器 afterCompletion → 过滤器 Filter
3. 示例代码
(1)自定义过滤器(Filter)
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
Http


3741

被折叠的 条评论
为什么被折叠?



