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

spring mvc的拦截器HandlerInterceptor 接口详解

HandlerInterceptor 接口详解

1. 接口方法说明
方法作用执行时机返回值/注意事项
preHandle请求处理前拦截在控制器方法执行前调用返回 false 中断后续流程;返回 true 继续执行
postHandle控制器方法执行后拦截在控制器方法返回结果后,视图渲染前调用无返回值,不可中断流程
afterCompletion请求完全结束后拦截在视图渲染完成后调用(无论是否成功)无返回值,用于资源清理

2. 完整示例代码
2.1 自定义拦截器A(返回 false)
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class InterceptorA implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("InterceptorA.preHandle: 开始拦截请求");
        // 返回 false 中断请求流程
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("InterceptorA.postHandle: 此处不会执行(因 preHandle 返回 false)");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("InterceptorA.afterCompletion: 请求已中断,但此方法仍会被调用");
    }
}
2.2 自定义拦截器B(正常流程)
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class InterceptorB implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("InterceptorB.preHandle: 正常拦截");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("InterceptorB.postHandle: 控制器方法执行后");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("InterceptorB.afterCompletion: 请求完成");
    }
}
2.3 注册拦截器配置
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private InterceptorA interceptorA;
    @Autowired
    private InterceptorB interceptorB;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册顺序:A 先于 B
        registry.addInterceptor(interceptorA).addPathPatterns("/**");
        registry.addInterceptor(interceptorB).addPathPatterns("/**");
    }
}
2.4 控制器示例
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {
    @GetMapping("/test")
    public String test() {
        System.out.println("控制器方法执行:此请求将被拦截器A中断");
        return "Hello World";
    }
}

3. 输出结果分析(访问 /test
InterceptorA.preHandle: 开始拦截请求
InterceptorA.afterCompletion: 请求已中断,但此方法仍会被调用
  • 拦截器A的 preHandle 返回 false
    • 拦截器B的 preHandle 不会被调用。
    • 控制器方法不会执行。
    • 拦截器B的 postHandleafterCompletion 也不会执行。
    • 拦截器A的 afterCompletion 仍会被调用(因已进入拦截器链)。

4. 常见处理场景示例

在拦截器中可实现以下功能:

  • 日志记录:记录请求时间、URL、IP 等(如示例中的 System.out.println)。
  • 权限校验:检查用户登录状态或角色权限。
  • 性能监控:计算接口响应时间。
  • 请求参数预处理:统一处理请求参数(如解密、格式化)。

5. 拦截器执行顺序总结表
阶段执行顺序规则示例(A注册在 B 前)
preHandle按注册顺序依次执行A → B
postHandle按注册逆序依次执行B → A
afterCompletion按注册逆序依次执行B → A

注意:若某个 preHandle 返回 false,后续拦截器和控制器方法均被跳过,但已执行的拦截器的 afterCompletion 仍会执行。

相关文章:

  • Java面试黄金宝典42
  • 2.ElasticSearch-Java API
  • 面试算法高频04-分治与回溯
  • Redis 简介+部署+常用命令!!!
  • 探秘传感器类型:解锁科技新视界
  • 关于使用python 安装 flask-openapi3扩展,使用docker 环境的完整复盘
  • oracle 索引失效
  • ffmpeg基础指令学习
  • SQL:DDL(数据定义语言)和DML(数据操作语言)
  • 旅游-第16届蓝桥第3次STEMA测评Scratch真题第2题
  • JavaScript 事件对象(Event)
  • redis集群模式
  • 数据驱动可视化实战:图表狐精准生成图表的完整数据范式
  • 前端基础:React项目打包部署服务器教程
  • Mysql-事务和索引
  • 设计模式之桥接、组合、装饰模式
  • 深度学习 Deep Learning 第20章 深度生成模型
  • Java 面试系列:深入了解 Java 中的异常处理 + 面试题
  • react 中将生成二维码保存到相册
  • 实现usb的MTP功能
  • wordpress网站主题插件/美国最新新闻头条
  • 网站的建设方面/百度推广官方电话
  • 电商网站首页怎么制作/武汉网站建设推广公司
  • wordpress 照片分享/网站如何做seo推广
  • 万网做网站花多少钱/搜索引擎优化的缺点包括
  • 网站开发工具 mac/成都网站快速优化排名