Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南

Spring Boot拦截器与过滤器的核心区别

拦截器(Interceptor)

基于Spring MVC框架实现,作用于控制器方法调用前后。通过实现HandlerInterceptor接口,可覆盖preHandlepostHandleafterCompletion方法。依赖Spring容器管理,可访问Spring上下文中的Bean(如Service层)。

过滤器(Filter)

基于Servlet规范,作用于请求进入Servlet容器前后。通过实现javax.servlet.Filter接口,覆盖doFilter方法。独立于Spring框架,无法直接使用Spring依赖注入。

关键差异

  • 作用阶段:过滤器在Servlet前后,拦截器在DispatcherServlet之后。
  • 依赖关系:拦截器可注入Spring Bean,过滤器需手动获取。
  • 粒度控制:拦截器可精确到Controller方法,过滤器仅针对URL。

拦截器实现示例

  1. 定义拦截器类
java 复制代码
public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        if (request.getHeader("Authorization") == null) {
            response.setStatus(401);
            return false; // 中断请求
        }
        return true;
    }
}
  1. 注册拦截器
java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/api/**");
    }
}

过滤器实现示例

  1. 定义过滤器类
java 复制代码
public class LogFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        System.out.println("Request URI: " + ((HttpServletRequest) request).getRequestURI());
        chain.doFilter(request, response); // 放行请求
    }
}
  1. 注册过滤器
java 复制代码
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<LogFilter> loggingFilter() {
        FilterRegistrationBean<LogFilter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new LogFilter());
        bean.addUrlPatterns("/*");
        return bean;
    }
}

实战应用场景

拦截器适用场景

  • 权限验证(如JWT校验)
  • 日志记录(记录Controller方法执行时间)
  • 参数预处理(统一格式化请求参数)

过滤器适用场景

  • 全局请求/响应编码设置
  • 防止XSS攻击(过滤敏感字符)
  • 静态资源缓存控制

性能与执行顺序

执行顺序
Filter -> DispatcherServlet -> Interceptor -> Controller

性能影响

  • 过滤器在更底层执行,性能损耗更低。
  • 拦截器因依赖Spring上下文,适合需要复杂业务逻辑的场景。

高级技巧

拦截器注入Bean

直接在拦截器类中使用@Autowired

java 复制代码
public class AuthInterceptor implements HandlerInterceptor {
    @Autowired
    private UserService userService; // 自动注入
}

过滤器获取Spring Bean

通过WebApplicationContextUtils

java 复制代码
UserService userService = WebApplicationContextUtils
    .getRequiredWebApplicationContext(request.getServletContext())
    .getBean(UserService.class);
相关推荐
烂蜻蜓1 小时前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
2601_962055978 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
EXI-小洲8 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
2601_961901709 小时前
SpringBoot使用Nacos进行application.yml配置管理
java·spring boot·spring
Lost of 程序猿9 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
何以解忧,唯有..10 小时前
LangChain 工具调用(Tool Calling)实战指南
java·前端·langchain
QQ_216962909611 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
前端 贾公子12 小时前
第09章:上下文与记忆 (2)
java·服务器·前端
2601_9622035112 小时前
Java进阶07集合(续)
java·开发语言
郑州光合科技余经理12 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php