1. 基本概念
1.1 过滤器(Filter)
来源:Servlet 规范(JavaEE 标准),不是 Spring 特有的。
拦截范围:可以拦截所有请求(包括静态资源:CSS、JS、图片等)。
执行位置:在
DispatcherServlet
之前执行。作用:对请求和响应做统一处理。
常见内置过滤器:
CharacterEncodingFilter
、HiddenHttpMethodFilter
。
1.2 拦截器(Interceptor)
来源:Spring MVC 提供的功能。
拦截范围:只拦截由
DispatcherServlet
分发的请求(即 Controller 层,静态资源不会被拦截)。执行位置:在 Controller 方法前后执行,并可在视图渲染前后做处理。
作用:业务相关的拦截和逻辑增强。
常见应用:权限校验、日志记录、上下文填充。
2. 执行流程对比
📌 请求生命周期:
浏览器请求 → Tomcat(Servlet容器) → Filter(过滤器) → DispatcherServlet → Interceptor(拦截器) → Controller(业务逻辑) ← Interceptor(返回) ← DispatcherServlet ← Filter ← 响应返回浏览器
🔑 区别:
Filter 更靠前,更底层,管“全局系统”。
Interceptor 更靠近业务,管“Controller逻辑”。
3. 核心区别
对比项 过滤器 Filter 拦截器 Interceptor 来源 Java Servlet 规范 Spring MVC 框架 执行时机 DispatcherServlet 之前 DispatcherServlet 之后,Controller 执行前后 拦截对象 所有请求(含静态资源) 仅 Controller 请求 粒度 粗,偏系统级 细,偏业务逻辑 配置方式 @WebFilter
或FilterRegistrationBean
实现 HandlerInterceptor
并注册到WebMvcConfigurer
适用场景 编码、跨域、XSS 过滤 登录校验、日志、权限控制
4. 使用场景
4.1 过滤器常见场景
统一编码处理(防止中文乱码)
跨域处理 CORS(处理 OPTIONS 请求等)
XSS 攻击过滤
SQL 注入拦截
静态资源访问控制
4.2 拦截器常见场景
登录校验(如检查 Session 或 Token)
接口权限控制
接口调用日志、耗时统计
请求参数预处理(填充用户上下文到 ThreadLocal)
国际化处理
5. 代码示例
5.1 Filter 示例(编码过滤器)
import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(urlPatterns = "/*") // 拦截所有请求 public class EncodingFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); System.out.println("Filter:统一编码处理"); chain.doFilter(request, response); // 放行 } }
5.2 Interceptor 示例(登录拦截器)
import org.springframework.web.servlet.HandlerInterceptor; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object user = request.getSession().getAttribute("user"); if (user == null) { response.sendRedirect("/login"); return false; // 拦截 } System.out.println("Interceptor:用户已登录"); return true; // 放行 } }
注册拦截器:
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()) .addPathPatterns("/**") // 拦截所有请求 .excludePathPatterns("/login", "/css/**", "/js/**"); // 排除 } }
6. 总结口诀
Filter 管系统:跨域、编码、安全防护。
Interceptor 管业务:登录校验、权限、日志统计。
📌 执行顺序:
Filter → DispatcherServlet → Interceptor → Controller → Interceptor → DispatcherServlet → Filter
spring--拦截器(Interceptor)&过滤器(Filter)[一]
于 2025-08-22 10:06:44 首次发布