spring中Interceptor的使用小结

 更新时间:2025年12月14日 10:42:43   作者:有梦想的攻城狮  
Spring Interceptor是Spring MVC提供的一种机制,用于在请求处理的不同阶段插入自定义逻辑,通过实现HandlerInterceptor接口并注册拦截器,可以控制拦截器的执行顺序和路径匹配规则,下面就来详细的介绍一下,感兴趣的可以了解一下

一、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 中统一添加响应头或加密敏感数据。

五、注意事项与最佳实践

性能优化

  • 避免在拦截器中执行耗时操作(如远程调用)。
  • 合理设置拦截路径,减少不必要的拦截。

常见问题排查

  • 拦截器未生效:检查路径匹配规则、是否注册到 Spring 容器。
  • 顺序混乱:通过 @Order 明确优先级。

与 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 的分阶段处理,能有效提升代码复用性和可维护性。

到此这篇关于spring中Interceptor的使用小结的文章就介绍到这了,更多相关spring Interceptor使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java源码解析HashMap简介

    Java源码解析HashMap简介

    今天小编就为大家分享一篇关于Java源码解析HashMap简介,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • SpringBoot application.yml和bootstrap.yml的区别

    SpringBoot application.yml和bootstrap.yml的区别

    本文主要介绍了SpringBoot application.yml和bootstrap.yml的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • SpringBoot的跨域注解@CrossOrigin解析

    SpringBoot的跨域注解@CrossOrigin解析

    这篇文章主要介绍了SpringBoot的跨域注解@CrossOrigin解析,Spring Framework 4.2 GA为CORS提供了第一类支持,使您比通常的基于过滤器的解决方案更容易和更强大地配置它,所以springMVC的版本要在4.2或以上版本才支持@CrossOrigin,需要的朋友可以参考下
    2023-12-12
  • Java监听器的作用及用法代码示例

    Java监听器的作用及用法代码示例

    这篇文章主要介绍了Java监听器的作用及用法代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java8 Stream教程之collect()的技巧

    Java8 Stream教程之collect()的技巧

    Java8引入了全新的Stream API,这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同,下面这篇文章主要给大家介绍了关于Java8 Stream教程之collect()的技巧,需要的朋友可以参考下
    2022-09-09
  • Java经典面试题最全汇总208道(四)

    Java经典面试题最全汇总208道(四)

    这篇文章主要介绍了Java经典面试题最全汇总208道(四),本文章内容详细,该模块分为了六个部分,本次为第四部分,需要的朋友可以参考下
    2023-01-01
  • 通过实例分析java多态

    通过实例分析java多态

    这篇文章主要介绍了通过实例分析java多态,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java后端把数据转换为树,map递归生成json树,返回给前端(后台转换)

    java后端把数据转换为树,map递归生成json树,返回给前端(后台转换)

    这篇文章主要介绍了java后端把数据转换为树,map递归生成json树,返回给前端实例(后台转换),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-01-01
  • Java之注解@Data和@ToString(callSuper=true)解读

    Java之注解@Data和@ToString(callSuper=true)解读

    在使用Lombok库的@Data注解时,若子类未通过@ToString(callSuper=true)注明包含父类属性,toString()方法只打印子类属性,解决方法:1. 子类重写toString方法;2. 子类使用@Data和@ToString(callSuper=true),父类也应使用@Data
    2024-11-11
  • SpringBoot @DS注解实现多数据源配置以及问题解决办法

    SpringBoot @DS注解实现多数据源配置以及问题解决办法

    这篇文章主要给大家介绍了关于SpringBoot @DS注解实现多数据源配置以及问题解决办法,所谓多数据源就是一个Java EE项目中采用了不同数据库实例中的多个库,或者是同一个数据库实例中的多个不同库,需要的朋友可以参考下
    2023-11-11

最新评论