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);
相关推荐
泡海椒3 分钟前
PDF 表格样式优化:jquick-pdf 边框、圆角、背景色
java·开发语言·pdf
根目录下的猫1 小时前
RK3588适配的轻量级AI模型推荐
人工智能·后端·python·目标检测
景熙55231 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
wno7042 小时前
Spring Security权限控制
java·python·spring
wno7042 小时前
Spring Boot整合Kafka
spring boot·kafka
星栈2 小时前
用 Rust 写 Agent 服务 -- adk-rust 上手记
后端·agent
杨运交2 小时前
[071][验证码模块]基于Spring拦截器的验证码认证设计思想
java·后端·spring
Geek-Chow3 小时前
CountDownLatch in Java
java
LucianaiB3 小时前
我用豆包工作 Seed-2.1-pro,复刻了 QQ 时代爆红的魔术图片
后端
码事漫谈3 小时前
智谱 ZCode 静默上传 Git 历史:48 小时信任危机复盘
后端