拦截器(Interceptor)与过滤器(Filter)的区别及使用场景
1. 核心区别
维度 | 过滤器(Filter) | 拦截器(Interceptor) |
---|---|---|
规范/框架 | Java Servlet 规范(所有 Servlet 容器支持,如 Tomcat、Jetty)。 | Spring 框架(基于 Spring MVC,属于应用层组件)。 |
作用范围 | 拦截所有进入容器的请求(包括静态资源,如 HTML、图片)。 | 仅拦截经过 Spring DispatcherServlet 的动态请求(如 Controller 的请求)。 |
执行层次 | Servlet 容器层(更底层,独立于 Spring)。 | Spring MVC 框架层(位于 DispatcherServlet 内部)。 |
依赖对象 | 操作 ServletRequest 和 ServletResponse (无法直接访问 Spring 上下文或处理器对象)。 | 可以访问 Spring 的 Handler (处理器对象)、ModelAndView 等上下文信息。 |
生命周期 | 随 Servlet 容器启动初始化,全局唯一。 | 由 Spring 容器管理,可通过依赖注入(如 @Autowired )使用 Spring Bean。 |
2. 功能差异
功能 | 过滤器(Filter) | 拦截器(Interceptor) |
---|---|---|
请求/响应内容修改 | ✔️ 可修改请求参数、响应内容(如压缩响应、替换敏感词)。 | ❌ 无法直接修改请求内容,但可操作 ModelAndView 。 |
全局性处理(如日志、权限) | ✔️ 适合处理全局通用逻辑(如设置字符编码、跨域处理)。 | ✔️ 适合处理业务相关逻辑(如用户权限校验、接口耗时统计)。 |
静态资源处理 | ✔️ 可拦截所有请求(包括静态资源)。 | ❌ 只能拦截动态请求(如 Controller 路径)。 |
3. 使用场景
过滤器(Filter)的典型场景
- 字符编码设置
统一请求/响应的编码(如 UTF-8)。public class EncodingFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { req.setCharacterEncoding("UTF-8"); res.setCharacterEncoding("UTF-8"); chain.doFilter(req, res); } }
- 跨域处理(CORS)
添加跨域响应头(如Access-Control-Allow-Origin
)。 - XSS/SQL 注入防护
过滤请求参数中的恶意脚本或特殊字符。 - 请求日志记录
记录请求的 URL、IP、耗时等信息。
拦截器(Interceptor)的典型场景
- 用户权限校验
在 Controller 方法执行前验证用户是否登录或具有权限。public class AuthInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) { if (req.getSession().getAttribute("user") == null) { res.sendRedirect("/login"); return false; // 中断请求 } return true; } }
- 接口性能监控
统计接口执行时间。public class PerformanceInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) { req.setAttribute("startTime", System.currentTimeMillis()); return true; } public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler, Exception ex) { long startTime = (Long) req.getAttribute("startTime"); log.info("Request URL: {} | Time: {}ms", req.getRequestURL(), System.currentTimeMillis() - startTime); } }
- 全局参数处理
在请求处理前向ModelAndView
中添加公共参数(如当前用户信息)。
4. 执行顺序
在请求处理流程中,过滤器先于拦截器执行:
请求 → Filter Chain → DispatcherServlet → Interceptor Chain → Controller
总结
- 过滤器(Filter):
适用于与业务无关的底层通用处理(如编码、安全),需操作ServletRequest/Response
。 - 拦截器(Interceptor):
适用于与业务相关的横切逻辑(如权限、日志),依赖 Spring 上下文和 MVC 组件。
组合使用:
在 Spring 应用中,通常同时使用两者:
- Filter 处理字符编码、跨域、XSS 过滤。
- Interceptor 处理权限校验、接口监控、参数注入。