Spring Boot拦截器Interceptor与过滤器Filter实战指南

 更新时间:2025年09月28日 10:26:19   作者:茶杯梦轩  
本文给大家介绍Spring Boot拦截器Interceptor与过滤器Filter实战指南,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

一、核心概念与原理对比

1. 技术规范层级

  • Filter(过滤器) 基于Servlet规范(J2EE标准),由Servlet容器(如Tomcat)管理,不依赖Spring框架。 示例:字符编码过滤器CharacterEncodingFilter
  • Interceptor(拦截器) 基于Spring MVC框架机制,由Spring容器管理,与Spring上下文深度集成。 示例:登录认证拦截器AuthInterceptor

2. 生命周期与作用范围

特性FilterInterceptor
初始化时机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开发步骤

  1. 实现Filter接口 重写doFilter方法,注意调用chain.doFilter()放行请求 。
  2. 注册方式
    • 注解方式@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开发步骤

  1. 实现HandlerInterceptor接口 重写preHandlepostHandleafterCompletion三阶段方法 。
  2. 注册拦截器
@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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 如何实现照片转化为回忆中的照片

    Java 如何实现照片转化为回忆中的照片

    本文主要介绍了可以对图片进行色彩处理的Java工具类,让图片变成回忆中的画面,主要将图片做黑白与褐色的处理。代码具有一定价值,感兴趣的童鞋可以关注一下
    2021-11-11
  • MyBatis-Plus解决逻辑删除与唯一索引的问题

    MyBatis-Plus解决逻辑删除与唯一索引的问题

    本文主要介绍了MyBatis-Plus解决逻辑删除与唯一索引的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 浅谈java的byte数组的不同写法

    浅谈java的byte数组的不同写法

    下面小编就为大家带来一篇浅谈java的byte数组的不同写法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Java中IO流文件读取、写入和复制的实例

    Java中IO流文件读取、写入和复制的实例

    下面小编就为大家带来一篇Java中IO流文件读取、写入和复制的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 深入解析Mybatis中缓存机制及优缺点

    深入解析Mybatis中缓存机制及优缺点

    MyBatis缓存分为一级(SqlSession级,自动维护)和二级(Mapper级,需配置),通过减少数据库访问提升性能,但存在脏数据和分布式不兼容风险,适合高频查询低频修改场景,需合理配置以平衡效率与一致性,本文给介绍Mybatis中缓存机制及优缺点,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • 新手初学Java的内部类

    新手初学Java的内部类

    这篇文章主要介绍了java内部类原理与用法,结合实例形式分析了Java内部类的概念、原理、分类及相关使用技巧,需要的朋友可以参考下,希望能给你带来帮助
    2021-07-07
  • SpringBoot中四种常用的条件装配技术详解

    SpringBoot中四种常用的条件装配技术详解

    Spring Boot提供了多种条件装配技术,允许开发者根据不同条件动态配置应用程序,本文将介绍Spring Boot中四种常用的条件装配技术,需要的可以参考下
    2025-04-04
  • Idea Jrebel 报错:Cannot reactivate,offline seat in use

    Idea Jrebel 报错:Cannot reactivate,offline 

    本文主要介绍了Idea Jrebel 报错:Cannot reactivate,offline seat in use,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 浅谈Java垃圾回收机制

    浅谈Java垃圾回收机制

    Java 中,程序员不需要关心所有不再使用的对象。垃圾回收机制自动销毁这些对象。垃圾回收机制是守护线程的最佳示例,因为它始终在后台运行。垃圾回收机制的主要目标是通过销毁无法访问的对象来释放堆内存。下面我们就来详细介绍吧
    2021-09-09
  • Springboot读取配置文件及自定义配置文件的方法

    Springboot读取配置文件及自定义配置文件的方法

    这篇文章主要介绍了Springboot读取配置文件及自定义配置文件的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12

最新评论