spring中的Interceptor使用说明

#『技术文档』写作方法征文挑战赛#

一、Interceptor 的核心概念

Interceptor(拦截器) 是 Spring MVC 提供的一种机制,用于在请求处理的不同阶段插入自定义逻辑。其核心作用包括:
• 预处理:在控制器方法执行前进行权限校验、日志记录等。

• 后处理:在控制器方法执行后修改响应数据或记录结果。

• 资源清理:在整个请求完成后释放资源或处理异常。

与 Filter 的区别:

特性Interceptor(拦截器)Filter(过滤器)
作用范围针对 Spring MVC 的控制器层作用于 Servlet 容器层面
依赖框架Spring MVC 管理Servlet 原生规范
数据访问可操作 ModelAndView仅能操作 HttpServletRequest/Response

在这里插入图片描述


二、Interceptor 的创建与配置

  1. 实现拦截器类
    继承 HandlerInterceptor 接口,重写以下方法:
public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 请求前处理(如权限校验)
        return true; // 返回 false 中断请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        // 控制器执行后、视图渲染前处理(如修改 Model 数据)
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 请求完成后处理(如资源清理)
    }
}
  1. 注册拦截器
    通过 WebMvcConfigureraddInterceptors 方法配置:
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/api/**")     // 拦截路径
                .excludePathPatterns("/login"); // 排除路径
    }
}

• 路径匹配规则:支持 Ant 风格(如 /user/* 匹配单层路径,/admin/** 匹配多级路径)。

• 多拦截器顺序:通过 Order 注解或实现 Ordered 接口控制优先级,值越小优先级越高。


三、拦截器的执行顺序

假设注册了 Interceptor1 和 Interceptor2:

  1. preHandle 方法:按注册顺序执行(Interceptor1 → Interceptor2)。
  2. postHandle 方法:按注册逆序执行(Interceptor2 → Interceptor1)。
  3. afterCompletion 方法:按注册逆序执行(Interceptor2 → Interceptor1)。

中断场景:若某一拦截器的 preHandle 返回 false,后续拦截器和控制器均不执行,但已通过 preHandle 的拦截器的 afterCompletion 仍会执行。


四、典型应用场景

  1. 权限校验
    preHandle 中检查用户登录状态或角色权限,拒绝非法请求。

    if (request.getSession().getAttribute("user") == null) {
        response.sendRedirect("/login");
        return false;
    }
    
  2. 日志记录
    记录请求路径、参数、耗时等信息:

    long startTime = System.currentTimeMillis();
    request.setAttribute("startTime", startTime);
    // 在 afterCompletion 中计算耗时
    
  3. 性能监控
    统计接口响应时间,优化慢请求。

  4. 数据预处理
    postHandle 中统一添加响应头或加密敏感数据。


五、注意事项与最佳实践

  1. 性能优化
    • 避免在拦截器中执行耗时操作(如远程调用)。

    • 合理设置拦截路径,减少不必要的拦截。

  2. 常见问题排查
    • 拦截器未生效:检查路径匹配规则、是否注册到 Spring 容器。

    • 顺序混乱:通过 @Order 明确优先级。

  3. 与 AOP 结合
    拦截器适用于请求生命周期中的横切逻辑,而 AOP 更适用于方法级别的切面(如事务管理)。


六、完整示例

  1. 日志拦截器
public class LogInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("请求开始: " + request.getRequestURI());
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("请求完成: " + request.getRequestURI());
    }
}
  1. 配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor()).addPathPatterns("/**");
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/admin/**")
                .order(1); // 高优先级
    }
}

总结

Spring Interceptor 是处理请求生命周期横切逻辑的利器,通过灵活配置路径和优先级,可实现权限控制、日志记录等通用功能。结合 preHandlepostHandleafterCompletion 的分阶段处理,能有效提升代码复用性和可维护性。

<think>好的,我现在需要帮助用户了解Spring Boot中拦截器Interceptor)的工作原理及用法。首先,我应该回顾一下自己之前学过的相关知识,以及用户提供的引用内容。 根据用户给出的引用,特别是引用[2]和引用[4],拦截器的配置是通过实现WebMvcConfigurer接口,并重写addInterceptors方法。同时,拦截器的应用场景包括权限验证、参数预处理、耗时监控等。我需要将这些信息整合起来,以清晰的结构回答用户的问题。 首先,拦截器的工作原理是怎样的呢?拦截器Spring MVC中允许对请求进行预处理和后处理,类似于过滤器,但更深入框架内部。在Spring Boot中,由于自动配置,使用拦截器更加方便。需要提到HandlerInterceptor接口的三个方法:preHandle、postHandle、afterCompletion,这些是拦截器的核心方法。 接下来,如何具体使用拦截器?应该分步骤说明,比如创建拦截器类、注册拦截器到配置中。用户提供的代码示例来自引用[2],可以直接引用,但需要解释每个部分的作用,例如addPathPatterns和excludePathPatterns方法的使用。 然后,结合引用[4],需要提到拦截器的典型应用场景,如权限验证、日志记录等。这部分可以举例说明,比如登录检查拦截器的实现,如引用[2]中的LoginCheckInterceptor。 此外,需要注意拦截器与过滤器的区别,用户可能对这两者混淆。虽然用户没有直接提问,但作为补充内容可能会有帮助。根据知识库中的信息,拦截器属于Spring MVC,而过滤器是Servlet规范的一部分,执行顺序不同,拦截器可以访问处理器的上下文,而过滤器更底层。 最后,需要生成相关问题,引导用户进一步学习。例如,拦截器与过滤器的区别、多个拦截器的执行顺序、如何排除特定路径等。这些问题可以帮助用户更深入地理解拦截器使用和配置。 在写作过程中,要确保遵循用户给出的格式要求,如使用中文回答,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及数学公式较少。同时,正确引用提供的引用内容,例如在提到应用场景时引用[4],在代码示例时引用[2]。 检查是否有遗漏的要点,比如是否需要详细说明每个方法(preHandle、postHandle、afterCompletion)的执行时机和返回值的作用。例如,preHandle返回false会中断请求,postHandle在处理器执行后但视图渲染前调用,afterCompletion在视图渲染完成后执行,用于资源清理等。 确保代码示例正确,解释清晰。用户提供的代码示例中使用了@Configuration和WebMvcConfigurer,需要说明这是配置类的标准做法,以及如何通过注册拦截器实例并设置路径模式。 可能还需要提到拦截器的执行顺序,如果有多个拦截器时的处理方式,比如按照注册顺序执行preHandle,逆序执行postHandle和afterCompletion。这部分内容如果用户没有提到,但作为进阶知识可以简要说明。 总结来说,回答的结构应该是:工作原理、实现步骤、应用场景、常见问题,最后是相关问题。确保每个部分都参考了用户提供的引用内容,并正确标注引用标记。</think>### Spring Boot拦截器(Interceptor)工作原理及用法详解 #### 一、拦截器核心原理 拦截器基于`HandlerInterceptor`接口实现,通过预处理、后处理机制拦截HTTP请求。在Spring Boot中需通过`WebMvcConfigurer`接口注册[^2],包含三个核心方法: 1. `preHandle()`: 请求到达Controller前执行,返回`true`放行,返回`false`中断流程 2. `postHandle()`: Controller执行后/视图渲染前触发 3. `afterCompletion()`: 整个请求完成后调用,常用于资源清理 $$流程图示例:请求 \rightarrow preHandle() \rightarrow Controller \rightarrow postHandle() \rightarrow 视图渲染 \rightarrow afterCompletion()$$ #### 二、实现步骤详解 1. **创建拦截器类** ```java public class DemoInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { System.out.println("--前置处理--"); return true; // 必须返回true才会继续执行 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { System.out.println("--后置处理--"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { System.out.println("--完成处理--"); } } ``` 2. **注册拦截器配置** ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Bean public DemoInterceptor demoInterceptor() { return new DemoInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(demoInterceptor()) .addPathPatterns("/**") // 拦截所有路径 .excludePathPatterns("/login"); // 排除登录页 } } ``` #### 三、典型应用场景[^4] | 场景类型 | 实现方式 | 业务价值 | |-----------------|-----------------------------------|------------------------------| | 接口权限验证 | preHandle中校验token/权限 | 防止未授权访问 | | 请求日志记录 | preHandle记录开始时间 | 统计接口性能 | | 数据格式转换 | postHandle统一包装返回值 | 标准化响应结构 | | 敏感操作审计 | afterCompletion记录操作日志 | 满足安全合规要求 | #### 四、高级配置技巧 1. **多拦截器执行顺序**:通过`Order`注解控制执行优先级 ```java registry.addInterceptor(A).order(1); registry.addInterceptor(B).order(2); // 数字越小优先级越高 ``` 2. **路径匹配模式**: - `/**`匹配所有路径(含子路径) - `/admin/*`匹配/admin下的单级路径 - `/api/**/v1`匹配多级路径中的v1接口 3. **排除静态资源**: ```java .excludePathPatterns("/css/**","/js/**") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有梦想的攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值