Filter 和 Interceptor区别
📅 2026/7/22 19:20:42
👁️ 阅读次数
📝 编程学习
文章目录
- 区别
- 适用场景
- 附:怎么用?
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 实现的功能
- 统一设置全局请求编码
request.setCharacterEncoding("UTF-8"); - CORS 跨域处理(请求到达 Spring 之前就要放行跨域头);
- 静态资源缓存、防盗链、文件上传底层预处理;
- 处理 Servlet 原生全局请求,不依赖 Spring 环境。
适合用 Interceptor 实现的功能
- 基于Controller 方法注解做权限控制(如
@LoginRequired、@AdminOnly); - 统一向页面 Model 注入全局公共数据;
- 打印接口日志:记录请求方法、类名、接口注解、方法参数;
- 接口 Token 校验,需要调用业务 Service 查询用户信息;
- 动态修改返回视图名称。
附:怎么用?
以防忘记怎么用,附个小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:资源释放、异常记录");}}
编程学习
技术分享
实战经验