Filter 和 Interceptor区别

📅 2026/7/22 19:20:42 👁️ 阅读次数 📝 编程学习
Filter 和 Interceptor区别

文章目录

    • 区别
    • 适用场景
    • 附:怎么用?

Spring MVC基础知识(包含Filter 和 Interceptor):https://blog.csdn.net/2303_80236475/article/details/146186506?spm=1001.2014.3001.5502
请求完整链路:

浏览器请求 → Tomcat 容器 → Filter(Servlet 规范) → DispatcherServlet → Interceptor(SpringMVC 框架) → Controller

区别

对比维度Filter 过滤器Interceptor 拦截器
规范归属Servlet 原生规范,Tomcat 容器管理SpringMVC 框架组件,Spring 容器管理
执行时机DispatcherServlet之前执行DispatcherServlet之后、Controller 之前执行
拦截粒度拦截所有请求:静态资源、图片、js、jsp、接口只拦截 Controller 控制器请求,不拦截静态资源(默认)
依赖容器不依赖 Spring,纯 Servlet 项目可用必须依赖 SpringMVC,仅 Spring 环境生效
获取对象只能拿到原生ServletRequest/ServletResponse可以拿到 Spring 上下文、Controller 处理器、ModelAndView
拦截时机细分只有doFilter一个方法,放行前后两段逻辑三段方法:preHandle /postHandle/afterCompletion,可操作视图
能否拿到 Controller不能,执行时还没映射处理器可以,handler 参数就是目标 Controller 方法对象
异常捕获只能捕获自身 doFilter 内异常,Controller 异常捕获不到afterCompletion 能接收 Controller 抛出的完整异常
应用场景编码统一设置、跨域、静态资源过滤、全局请求编码登录权限校验、接口日志记录、修改 Model 视图、接口 Token 校验

适用场景

适合用 Filter 实现的功能

  1. 统一设置全局请求编码request.setCharacterEncoding("UTF-8")
  2. CORS 跨域处理(请求到达 Spring 之前就要放行跨域头);
  3. 静态资源缓存、防盗链、文件上传底层预处理;
  4. 处理 Servlet 原生全局请求,不依赖 Spring 环境。

适合用 Interceptor 实现的功能

  1. 基于Controller 方法注解做权限控制(如@LoginRequired@AdminOnly);
  2. 统一向页面 Model 注入全局公共数据;
  3. 打印接口日志:记录请求方法、类名、接口注解、方法参数
  4. 接口 Token 校验,需要调用业务 Service 查询用户信息;
  5. 动态修改返回视图名称。

附:怎么用?

以防忘记怎么用,附个小Demo

过滤器Filter

//@WebFilter("/*")publicclassLoginFilterimplementsFilter{// 容器启动初始化一次@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{System.out.println("Filter 初始化");}// 每次请求都会执行@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequestreq=(HttpServletRequest)request;System.out.println("Filter 前置逻辑:登录校验");// 放行,执行后续资源(拦截器、Controller)chain.doFilter(request,response);// 响应回来后的后置逻辑System.out.println("Filter 后置逻辑:响应处理");}// 容器销毁执行@Overridepublicvoiddestroy(){System.out.println("Filter 销毁");}}

Interceptor 拦截器

publicclassLoginInterceptorimplementsHandlerInterceptor{// 1. Controller 执行前,返回false直接拦截请求@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println("Interceptor preHandle:登录校验");// true放行;false拦截,不会进入Controllerreturntrue;}// 2. Controller执行完,视图渲染前@OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println("Interceptor postHandle:修改视图数据");}// 3. 视图渲染完成后,最后执行(异常也会走这里)@OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println("Interceptor afterCompletion:资源释放、异常记录");}}