当前位置: 首页 > news >正文

Spring Boot 拦截器(Interceptor)

1.什么是拦截器?

Spring Boot 拦截器(Interceptor)是 Spring MVC 框架提供的一种机制,用于在请求到达 Controller 之前返回响应给客户端之后插入自定义逻辑。它基于 HandlerInterceptor 接口实现,允许你在请求处理的不同阶段(如预处理、后处理)添加通用功能。

拦截器 vs. 过滤器(Filter)
  • 拦截器:作用于 Spring MVC 层,可以访问 Spring 的上下文(如 Bean),适合处理与业务相关的逻辑(如权限校验、日志记录)。

  • 过滤器:作用于 Servlet 层(更底层),无法直接使用 Spring 的依赖注入,适合处理与协议相关的逻辑(如编码转换、跨域处理)。


2.拦截器的核心方法

拦截器通过实现 HandlerInterceptor 接口定义以下方法:

  1. preHandle

    • 时机:在 Controller 方法执行之前调用。

    • 用途:权限校验、参数预处理、请求日志记录。

    • 返回值

      • true:继续执行后续拦截器和 Controller 方法。

      • false:中断请求,直接返回响应。

  2. postHandle

    • 时机:在 Controller 方法执行之后、视图渲染之前调用

    • 用途:修改 ModelAndView 数据、记录请求处理时间。

  3. afterCompletion

    • 时机:在请求完全结束后调用(视图渲染完成)。

    • 用途:资源清理、统一异常处理、记录最终响应状态。


3.使用场景

  1. 权限验证

    • 在 preHandle 中校验用户登录状态或权限,未登录则重定向到登录页。

      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
          if (request.getSession().getAttribute("user") == null) {
              response.sendRedirect("/login");
              return false; // 中断请求
          }
          return true;
      }

      日志记录

    • 记录请求的 URL、参数、耗时等信息。

      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
          long startTime = System.currentTimeMillis();
          request.setAttribute("startTime", startTime);
          return true;
      }
      
      @Override
      public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
          long startTime = (Long) request.getAttribute("startTime");
          long duration = System.currentTimeMillis() - startTime;
          log.info("Request URL: {} - Time: {}ms", request.getRequestURL(), duration);
      }

    • 性能监控

      • 统计接口耗时,识别慢请求。

    • 参数预处理

      • 对请求参数进行统一校验或格式化(如 Trim 空格)。

    • 跨域处理

      • 添加统一的跨域响应头(也可以通过过滤器实现)

        如何使用拦截器?

      • 实现 HandlerInterceptor 接口

        注册拦截器到 Spring MVC
        通过 WebMvcConfigurer 配置类添加拦截器并指定拦截路径:
        @Configuration
        public class WebConfig implements WebMvcConfigurer {
            @Autowired
            private AuthInterceptor authInterceptor;
        
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(authInterceptor)
                        .addPathPatterns("/api/**")   // 拦截的路径
                        .excludePathPatterns("/api/login"); // 排除的路径
            }
        }

相关文章:

  • 目标检测——数据处理
  • 嵌入式晶振细究
  • 《深度揭秘:生成对抗网络如何重塑遥感图像分析精度》
  • 2025年2月个人工作生活总结
  • 网络层IP协议
  • C++—类与对象(中)
  • JAVA笔记【一】
  • 张雪峰教育观点及争议分析
  • 【java】@Transactional导致@DS注解切换数据源失效
  • 为AI聊天工具添加一个知识系统 之128 详细设计之69 编程 核心技术:Cognitive Protocol Language 之1
  • AutoMQ:无需 Cruise Control 实现 Kafka 的自动分区再平衡
  • GitLab 密钥详解:如何安全地使用 SSH 密钥进行身份验证
  • 用Python之requests库调用大型语言模型(LLM)API的流式输出与非流式输出比较
  • [C#]C#移动文件报错完全限定文件名必须少于 260 个字符,并且目录名必须少于 248 个字符
  • 新版的 distrobox 首先需要:设置密码
  • Spring Boot问题总结
  • deepseek+mermaid【自动生成流程图】
  • 独立开发者的内容营销教程
  • MySQL双主搭建-5.7.35
  • Vue 3 新特性:对比 Vue 2 的重大升级
  • 网站不能访问如何做冗余/seo诊断分析在线工具
  • 做企业商城网站要多少钱/如何看待百度竞价排名
  • 创意网站建设话术/怎么做推广赚钱
  • 毕业设计代做网站多少钱/seo标题优化关键词怎么选
  • 网站分析百度 代码/seo网站推广如何做
  • 网站服务器在哪里买好/西安百度