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

spring之自定义拦截器:HandlerInterceptor 控制请求生死权

HandlerInterceptor

        • HandlerInterceptor 执行流程图
        • 定义拦截器

HandlerInterceptor 执行流程图
        ┌───────────────────────────────────┐│           客户端发起请求           │└───────────────────────────────────┘│▼┌───────────────────────────────────┐│ Filter 链 (Servlet 过滤器)          ││  - 最先执行,可做全局安全/编码处理   │└───────────────────────────────────┘│▼┌───────────────────────────────────┐│ Interceptor.preHandle()            ││  - 请求到达 Controller 前调用        ││  - 返回 true → 继续执行             ││  - 返回 false → 请求被拦截,直接结束 │└───────────────────────────────────┘│(如果放行,继续)▼┌───────────────────────────────────┐│       Controller 方法执行          ││       (业务逻辑 / Service 调用)     │└───────────────────────────────────┘│▼┌───────────────────────────────────┐│ Interceptor.postHandle()           ││  - Controller 执行完成后调用        ││  - 渲染视图前,可以修改 ModelAndView ││  - 常用于统计耗时、追加数据         │└───────────────────────────────────┘│▼┌───────────────────────────────────┐│ 视图渲染 / JSON 响应返回客户端       │└───────────────────────────────────┘│▼┌───────────────────────────────────┐│ Interceptor.afterCompletion()      ││  - 请求完成后调用                   ││  - 可用于异常记录、资源清理         │└───────────────────────────────────┘

preHandle
位置:Controller 执行前
作用:权限校验、登录状态校验、请求日志
返回 false → 直接中断,不进入 Controller

postHandle
位置:Controller 执行后,视图渲染前
作用:性能统计、响应数据增强

afterCompletion
位置:视图渲染完成后(请求生命周期的最后一步)
作用:异常日志、清理资源(如 MDC、ThreadLocal)

定义拦截器
@Component
public class CustomInterceptor implements HandlerInterceptor {// Controller 方法执行前调用(相当于门禁检查)@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {long start = System.currentTimeMillis();request.setAttribute("startTime", start);// 示例:检查用户是否登录String token = request.getHeader("Authorization");if (token == null || !token.equals("valid-token")) {response.setContentType("application/json;charset=UTF-8");response.getWriter().write("{\"code\":401, \"msg\":\"未登录或 token 无效\"}");return false; // ❌ 阻止继续进入 Controller}return true; // ✅ 放行}// Controller 执行后,视图渲染前调用@Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView modelAndView) {// 示例:接口响应时间统计long start = (long) request.getAttribute("startTime");long cost = System.currentTimeMillis() - start;System.out.println("接口耗时:" + cost + "ms");}// 请求完成后调用(如异常日志收集)@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) {if (ex != null) {System.err.println("请求出现异常:" + ex.getMessage());}}
}
  • 注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate CustomInterceptor customInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(customInterceptor).addPathPatterns("/**")             // 拦截所有请求.excludePathPatterns("/login", "/error"); // 排除登录、错误页}
}

常见使用场景

  • 统一登录校验 / 权限控制
    → 在 preHandle 阶段校验 JWT / Token,决定是否放行。

  • 接口性能监控
    → 在 postHandle 或 afterCompletion 里计算耗时,上报到日志/监控系统。

  • 统一请求日志
    → 在 preHandle 打印请求参数、afterCompletion 打印响应状态。

  • 分布式链路追踪
    → 在 preHandle 生成 traceId,放入 MDC;在 afterCompletion 清理。

http://www.dtcms.com/a/343642.html

相关文章:

  • Java微服务开发:从入门到精通
  • 证书只是手段:把学习变成可复用能力的路线图
  • FPGA 在情绪识别领域的护理应用(三)
  • gRPC 与 HTTP 性能对比分析
  • C++浅拷贝和深拷贝区别
  • 【华为OD-C卷-019 对称字符串 100分(python、java、c++、js、c)】
  • 【Transient-Free 3DGS】delayed densification + coarse to fine增加GS的鲁棒性
  • 【GaussDB】使用gdb定位GaussDB编译package报错
  • 图像中物体计数:基于YOLOv5的目标检测与分割技术
  • 智能编程中的智能体与 AI 应用:概念、架构与实践场景
  • Effective C++ 条款54:熟悉标准库
  • typescript常用命令选项
  • Function Call与MCP:大模型能力扩展的两条路径对比
  • CF每日4题(1500-1700)
  • 谈谈架构的内容
  • 前端别名与环境变量使用
  • AI 赋能教育变革:机遇、实践与展望
  • 基于随机森林的红酒分类与特征重要性分析
  • MySQL高可用之MHA实战
  • 【高等数学】第九章 多元函数微分法及其应用——第九节 二元函数的泰勒公式
  • 北京JAVA基础面试30天打卡14
  • 【51单片机学习】AT24C02(I2C)、DS18B20(单总线)、LCD1602(液晶显示屏)
  • AI 在医疗领域的应用与挑战
  • 带宽评估(三)lossbase_v2
  • 测试面试题第二篇:专项业务领域(上)
  • 嵌入式学习day33-网络-c/s
  • 有符号和无符号的区别
  • DAG的DP(UVA437 巴比伦塔 The Tower of Babylon)
  • Java—— 网络编程
  • 具身导航近期论文分享(一)