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 小时前
java关于内部类
java·开发语言
好好沉淀3 小时前
Java 项目中的 .idea 与 target 文件夹
java·开发语言·intellij-idea
gusijin3 小时前
解决idea启动报错java: OutOfMemoryError: insufficient memory
java·ide·intellij-idea
To Be Clean Coder3 小时前
【Spring源码】createBean如何寻找构造器(二)——单参数构造器的场景
java·后端·spring
吨~吨~吨~3 小时前
解决 IntelliJ IDEA 运行时“命令行过长”问题:使用 JAR
java·ide·intellij-idea
你才是臭弟弟3 小时前
SpringBoot 集成MinIo(根据上传文件.后缀自动归类)
java·spring boot·后端
短剑重铸之日3 小时前
《设计模式》第二篇:单例模式
java·单例模式·设计模式·懒汉式·恶汉式
码农水水3 小时前
得物Java面试被问:消息队列的死信队列和重试机制
java·开发语言·jvm·数据结构·机器学习·面试·职场和发展
summer_du3 小时前
IDEA插件下载缓慢,如何解决?
java·ide·intellij-idea
C澒3 小时前
面单打印服务的监控检查事项
前端·后端·安全·运维开发·交通物流