深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

本文主要是介绍深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并...

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

一、核心概念对比

1. 本质区别

维度过滤器(Filter)拦截器(Interceptor)
规范层级Servlet规范(J2EE标准)Spring MVC框架机制
作用范围所有请求(包括静态资源)只处理Controller请求
依赖关系不依赖Spring容器完全集成Spring IOC容器
执行顺序最先执行(在DispatcherServlet之前)在DispatcherServlet之后执行
异常处理无法直接使用Spring的异常处理机制可以通过@ControllerAdvice统一处理

2. 执行流程示意图

HTTP Request
  ↓
Filter Chain(doFilter)
  ↓
DispatcherServlet
  ↓
Interceptor.preHandle
  ↓
Controller Method
  ↓
Interceptor.postHandle
  ↓
View Rendering(如有)
  ↓
Interceptor.afterCompletion
  ↓
Filter Chain(返回响应)

二、过滤器(Filter)开发指南

1. 基础实现方式

@Component
public class LogFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
                         FilterChain chain) throws IOException, ServletException {
        long startTime = System.currentTimeMillis();
        HttpServletRequest req = (HttpServletRequest) request;
        // 前置处理
        System.out.println("Request URI: " + req.getRequestURI());
        chain.doFilter(request, response); // 放行请求
        // 后置处理
        long duration = System.currentTimeMillis() - startTime;
        System.out.println("Request completed in " + duration + "ms");
    }
}

2. 高级配置技巧

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<LogFilter> loggingFilter() {
        FilterRegistrationBean<LogFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new LogFilter());
        registration.addUrlPatterns("/api/*");
        registration.setOrder(Ordered.HIGHEST_PRECEDENCE); // 设置优先级
        return registration;
    }
}

典型应用场景

  • 请求日志记录
  • 全局字符编码设置
  • 跨域处理(CORS)
  • XSS防御过滤
  • 请求内容压缩/解压

三、拦截器(Interceptor)开发指南

1. 标准实现模板

@Component
public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, 
                           HttpServletResponse response, 
                           Object handler) throws Exception {
        String token = request.getHeader("Authorization");
        if php(!validateToken(token)) {
            response.sendError(401, "Invalid token");
            return false; // 中断请求
        }
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, 
                          HttpServletResponse response, 
                      www.chinasem.cn    Object handler,
                          ModelAndView modelAndView) throws Exception {
        // ControllerChina编程方法执行后,视图渲染前
    }
    @Override
    public void afterCompletion(HttpServletRequest request, 
                               HttpServletResponse response, 
                               Object handler, 
                               Exception ex) throws Exception {
        // 请求完全结束后(包括视图渲染)
    }
}

2. 注册拦截器配置

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private AuthInterceptor authInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authphpInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login", "/public/**");
    }
}

典型应用场景

  • 接口权限验证
  • 请求参数预处理
  • 接口耗时监控
  • 敏感操作日志
  • 数据绑定前校验

四、核心差异深度解析

1. 执行顺序对比实验

配置多个过滤器和拦截器时的执行顺序:

Filter1 → Filter2 → Interceptor.preHandle 
→ Controller 
→ Interceptor.postHandle 
→ Interceptor.afterCompletion 
→ Filter2 → Filter1

2. 异常处理差异

// 在过滤器中处理异常
public void doFilter(...) {
    try {
        chain.doFilter(request, response);
    } catch (Exception e) {
        response.sendError(500, "Server Error");
    }
}
// 在拦截器中处理异常
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<?> handleException(Exception e) {
        return ResponseEntitywww.chinasem.cn.internalServerError().body("Error occurred");
    }
}

3. 异步请求处理

// 拦截器需实现AsyncHandlerInterceptor
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, 
                                          HttpServletResponse response, 
                                          Object handler) {
    // 异步请求的特殊处理
}

五、最佳实践与选型策略

1. 技术选型决策树

是否需要处理静态资源?
├─ 是 → 必须使用Filter
└─ 否 → 
   是否需要访问Spring Bean?
   ├─ 是 → 选择Interceptor
   └─ 否 → 
      是否需要最早处理请求?
      ├─ 是 → 选择Filter
      └─ 否 → 根据业务复杂度选择

2. 性能优化建议

  • 过滤器:避免在过滤器中做复杂业务逻辑
  • 拦截器:preHandle方法尽量轻量化
  • 两者都应避免:
    • 同步阻塞操作
    • 频繁的IO操作
    • 大对象的内存操作

3. 常见陷阱规避

  • 过滤器
    • 忘记调用chain.doFilter()导致请求阻塞
    • 修改请求参数未使用Wrapper类
  • 拦截器
    • 在postHandle中修改ModelAndView导致NPE
    • 异步请求中误用afterCompletion

六、实战案例演示

案例1:接口耗时监控系统

// 拦截器实现
public class MetricsInterceptor implements HandlerInterceptor {
    private static final ThreadLocal<Long> startTime = new ThreadLocal<>();
    @Override
    public boolean preHandle(...) {
        startTime.set(System.currentTimeMillis());
        return true;
    }
    @Override
    public void afterCompletion(...) {
        long duration = System.currentTimeMillis() - startTime.get();
        metricsservice.recordRequestTime(request.getRequestURI(), duration);
        startTime.remove();
    }
}

案例2:全局防重放攻击过滤器

public class ReplayAttackFilter implements Filter {
    private Cache<String, Boolean> requestCache = 
        Caffeine.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES).build();
    @Override
    public void doFilter(...) {
        String nonce = request.getHeader("X-Nonce");
        if (requestCache.getIfPresent(nonce) != null) {
            response.sendError(400, "Duplicate request");
            return;
        }
        requestCache.put(nonce, true);
        chain.doFilter(request, response);
    }
}

七、扩展知识

1. 与AOP的区别

  • AOP
    • 基于代理模式实现
    • 可以精确控制到具体方法
    • 更适合业务层面的切面处理
  • 拦截器
    • 基于HandlerMapping实现
    • 主要针对HTTP请求生命周期
    • 更适合Web层通用处理

2. 高级应用场景

  • 过滤器链:实现责任链模式
  • 拦截器栈:组合多个拦截逻辑
  • 动态启用/禁用:结合配置中心实现

总结建议

  1. 优先使用拦截器处理Web层通用逻辑
  2. 保留过滤器用于底层请求处理
  3. 复杂场景可以组合使用两者
  4. 生产环境务必进行性能压测

通过合理运用过滤器和拦截器,开发者可以构建出高可维护性的Web应用架构。建议结合APM工具(如SkyWalking)监控两者的执行效率,持续优化系统性能。

到此这篇关于深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南的文章就介绍到这了,更多相关Spring Boot拦截器Interceptor与过滤器Filter内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155205

相关文章

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Java中的volatile关键字多方面解析

《Java中的volatile关键字多方面解析》volatile用于保证多线程变量可见性与禁止重排序,适用于状态标志、单例模式等场景,但不保证原子性,相较synchronized更轻量,但需谨慎使用以... 目录1. volatile的作用1.1 保证可见性1.2 禁止指令重排序2. volatile的使用

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal

SpringBoot集成Shiro+JWT(Hutool)完整代码示例

《SpringBoot集成Shiro+JWT(Hutool)完整代码示例》ApacheShiro是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,在现代应用开发中,Shiro因... 目录一、背景介绍1.1 为什么使用Shiro?1.2 为什么需要双Token?二、技术栈组成三、环境

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

在 Spring Boot 中连接 MySQL 数据库的详细步骤

《在SpringBoot中连接MySQL数据库的详细步骤》本文介绍了SpringBoot连接MySQL数据库的流程,添加依赖、配置连接信息、创建实体类与仓库接口,通过自动配置实现数据库操作,... 目录一、添加依赖二、配置数据库连接三、创建实体类四、创建仓库接口五、创建服务类六、创建控制器七、运行应用程序八

基于Spring Boot 的小区人脸识别与出入记录管理系统功能

《基于SpringBoot的小区人脸识别与出入记录管理系统功能》文章介绍基于SpringBoot框架与百度AI人脸识别API的小区出入管理系统,实现自动识别、记录及查询功能,涵盖技术选型、数据模型... 目录系统功能概述技术栈选择核心依赖配置数据模型设计出入记录实体类出入记录查询表单出入记录 VO 类(用于

深入解析Java NIO在高并发场景下的性能优化实践指南

《深入解析JavaNIO在高并发场景下的性能优化实践指南》随着互联网业务不断演进,对高并发、低延时网络服务的需求日益增长,本文将深入解析JavaNIO在高并发场景下的性能优化方法,希望对大家有所帮助... 目录简介一、技术背景与应用场景二、核心原理深入分析2.1 Selector多路复用2.2 Buffer