Spring Boot拦截器Interceptor与过滤器Filter实战指南
作者:茶杯梦轩
本文给大家介绍Spring Boot拦截器Interceptor与过滤器Filter实战指南,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
一、核心概念与原理对比
1. 技术规范层级
- Filter(过滤器) 基于Servlet规范(J2EE标准),由Servlet容器(如Tomcat)管理,不依赖Spring框架。 示例:字符编码过滤器
CharacterEncodingFilter
。 - Interceptor(拦截器) 基于Spring MVC框架机制,由Spring容器管理,与Spring上下文深度集成。 示例:登录认证拦截器
AuthInterceptor
。
2. 生命周期与作用范围
特性 | Filter | Interceptor |
---|---|---|
初始化时机 | Web应用启动时初始化 | 首次请求触发时初始化 |
作用范围 | 所有Web资源(Servlet、静态资源) | 仅Spring MVC的Controller请求 |
执行阶段 | Servlet处理前后 | Controller方法执行前、后及视图渲染后 |
3. 执行流程顺序
HTTP请求 → Filter链 → DispatcherServlet → Interceptor.preHandle → Controller处理 → Interceptor.postHandle → 视图渲染 → Interceptor.afterCompletion → Filter链返回响应
二、使用场景与选型策略
1. 优先选择Filter的场景
- 全局基础处理 需对所有请求统一处理,如:
- 字符编码设置(UTF-8)
- 跨域处理(CORS头配置)
- XSS防御(参数过滤)
- 非Spring环境 项目未使用Spring框架时,Filter是唯一选择。
- 代码示例(Filter)
@WebFilter("/*") public class LogFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { long start = System.currentTimeMillis(); chain.doFilter(req, res); // 必须放行请求 System.out.println("耗时:" + (System.currentTimeMillis() - start)); } }
2. 优先选择Interceptor的场景
- 业务逻辑拦截 需与Spring上下文交互时,如:
- 登录认证(读取Session)
- 权限校验(结合Spring Security)
- 参数预处理(如分页参数封装)
- 代码示例(Interceptor)
@Component public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) { if (req.getSession().getAttribute("user") == null) { res.sendRedirect("/login"); return false; // 中断请求 } return true; } }
3. 混合使用场景
- 日志记录:Filter记录请求开始时间,Interceptor记录Controller耗时
- 安全防护:Filter做XSS过滤,Interceptor做权限校验
三、实现步骤与配置指南
1. Filter开发步骤
- 实现Filter接口 重写
doFilter
方法,注意调用chain.doFilter()
放行请求 。 - 注册方式
- 注解方式:
@WebFilter(urlPatterns="/*")
(需主类加@ServletComponentScan
) - 配置类方式(推荐):
- 注解方式:
@Bean public FilterRegistrationBean<LogFilter> logFilter() { FilterRegistrationBean<LogFilter> bean = new FilterRegistrationBean<>(); bean.setFilter(new LogFilter()); bean.setOrder(1); // 优先级 bean.addUrlPatterns("/*"); return bean; }
2. Interceptor开发步骤
- 实现HandlerInterceptor接口 重写
preHandle
、postHandle
、afterCompletion
三阶段方法 。 - 注册拦截器
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/login", "/static/**"); } }
四、常见问题与避坑指南
1. 执行顺序问题
- 多个Filter:按
@Order
值或注册顺序执行 - 多个Interceptor:按
registry.addInterceptor()
添加顺序执行 - 经典错误:在Filter中修改请求参数后,Interceptor未获取到新值(需使用
HttpServletRequestWrapper
包装类)
2. 配置路径陷阱
- Filter路径匹配:
/*
表示所有路径,/api/*
仅匹配一级子路径 - Interceptor排除路径:静态资源需显式排除(如
excludePathPatterns("/static/**")
)
3. Spring上下文依赖
- Filter中注入Bean:需通过
FilterRegistrationBean
配置,直接@Autowired
会失效(解决方法:使用WebApplicationContextUtils
获取上下文) - Interceptor中注入Bean:可直接使用
@Autowired
(Spring管理)
4. 请求阻塞问题
- Filter未调用chain.doFilter():导致请求未传递到后续组件
- Interceptor的preHandle返回false:需手动响应错误信息(如
response.sendError(401)
)
五、总结与选型建议
维度 | Filter优势 | Interceptor优势 |
---|---|---|
技术栈 | 兼容所有Java Web项目 | 深度整合Spring生态 |
性能 | 更接近底层,处理速度快 | 可访问Spring上下文,业务逻辑处理更便捷 |
灵活性 | 全局处理能力强 | 支持细粒度控制(如按Controller方法拦截) |
选型口诀:
- “底层通用选Filter,业务整合用Interceptor”
- “静态资源走Filter,动态请求过Interceptor”
通过合理搭配Filter与Interceptor,可构建高效、安全的Web应用。建议在复杂项目中结合使用,发挥各自优势,如Filter处理全局基础设施,Interceptor处理业务逻辑
到此这篇关于Spring Boot拦截器Interceptor与过滤器Filter实战指南的文章就介绍到这了,更多相关Spring Boot拦截器Interceptor与过滤器Filter内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!