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中do-while循环的使用方法及注意事项详解

    Java中do-while循环的使用方法及注意事项详解

    这篇文章主要介绍了Java中do-while循环的使用方法及注意事项的相关资料,在Java编程中,do-while循环是一种基本的循环控制结构,它至少执行一次循环体,然后根据条件判断是否继续,文中将用法介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Java前端开发之HttpServletRequest的使用

    Java前端开发之HttpServletRequest的使用

    service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大
    2023-01-01
  • Java8新特性:函数式编程

    Java8新特性:函数式编程

    Java8最新引入函数式编程概念,该项技术可以大大提升编码效率,本文会对涉及的对象等进行两种方法的对比,对新技术更直白的看到变化,更方便学习
    2021-06-06
  • Spring Boot 控制层之参数传递方法详解

    Spring Boot 控制层之参数传递方法详解

    这篇文章主要介绍了Spring Boot 控制层之参数传递方法详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • java后台启动jar包的一些命令汇总

    java后台启动jar包的一些命令汇总

    这篇文章主要介绍了java后台启动jar包的一些命令汇总,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-03-03
  • 详解spring多线程与定时任务

    详解spring多线程与定时任务

    本篇文章主要介绍了spring多线程与定时任务,详细的介绍了spring多线程任务和spring定时任务,有兴趣的可以了解一下。
    2017-04-04
  • Java八种基本变量作为类的成员变量的默认值操作

    Java八种基本变量作为类的成员变量的默认值操作

    这篇文章主要介绍了Java八种基本变量作为类的成员变量的默认值操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Spring Boot启动及退出加载项的方法

    Spring Boot启动及退出加载项的方法

    这篇文章主要介绍了Spring Boot启动及退出加载项的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • SpringCloud 分布式锁的多种实现

    SpringCloud 分布式锁的多种实现

    本文主要介绍了SpringCloud 分布式锁的多种实现,主要有三种方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • SpringBoot采用Dynamic-Datasource方式实现多JDBC数据源

    SpringBoot采用Dynamic-Datasource方式实现多JDBC数据源

    在某些情况下,如果我们需要配置多个数据源,本文主要介绍了SpringBoot采用Dynamic-Datasource方式实现多JDBC数据源,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10

最新评论