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

spring中RequestContextHolder

1、在 Spring 框架中,

RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); 

是获取当前请求上下文的核心方法。以下是其关键要点及注意事项:


一、核心机制

  1. 作用原理
    通过 ThreadLocal 存储当前线程的请求属性对象 RequestAttributes,支持在控制器、服务层等位置直接访问请求参数、头信息或会话。
    转换为 ServletRequestAttributes 后可获取 HttpServletRequest 对象:
  RequestAttributes attributes = RequestContextHolder.getRequestAttributes();if (attributes instanceof ServletRequestAttributes) {HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();// 可进一步操作 request 对象
}


二、适用场景

  • Web 请求处理
    适用于控制器(Controller)、服务层(Service)、过滤器(Filter)、拦截器(Interceptor)等与当前 HTTP 请求强关联的场景。
    典型用途:提取请求头中的租户标识、鉴权 Token 等公共参数。

三、多线程处理要点

  1. 子线程继承问题

    • 默认无法获取父线程上下文,需手动传递并设置 inheritable=true 
      // 父线程中设置可继承模式
      ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
      // 主线程设置
      RequestContextHolder.setRequestAttributes(sra , true); // 子线程获取
      RequestAttributes subAttributes = RequestContextHolder.getRequestAttributes();

    • 若主线程过早结束(如异步任务未等待),子线程可能因上下文被清理而获取空值。
  2. 并行流风险
    并行流(parallelStream)内部使用线程池,需提前显式绑定请求上下文,否则抛出空指针异常。

 


‌四、最佳实践

  1. 避免滥用
    优先通过方法参数传递 HttpServletRequest,而非全局依赖 RequestContextHolder,以提高代码可测试性。

  2. 异步任务处理
    提交异步任务前显式传递上下文,并确保主线程等待子线程完成(如使用 CompletableFuture

     // 示例:线程池任务传递上下文executor.submit(() -> {RequestContextHolder.setRequestAttributes(attributes); // 执行任务 
    });


通过合理使用并结合线程上下文管理,可高效实现跨层请求参数传递,同时规避多线程环境下的陷阱。

http://www.xdnf.cn/news/4643.html

相关文章:

  • Wubuntu安装时创建分区失败解决方案
  • 预渲染 Prerender
  • 图漾相机——Sample_V2示例程序(待补充)
  • 【UltralyticsYolo11图像分类完整项目-03】Onnx版Cpu预测C++实现
  • 解构语言模型推理过程,超越最终答案:通过分析子思考路径提升大语言模型推理准确性的方法研究
  • FastExcel 本地开发和Linux上上传Resource文件的差异性
  • 直接用字符串方式 split(“。“) 来切句,虽然能把句子拆开,但无法和 BERT 模型的 token 位置对应(embedding 用不上)
  • 高炉炼铁:构建全流程工艺可视化管控体系
  • Redis最新入门教程
  • 多返回值(C++)
  • CF后台如何设置TCP 和 UDP 端口?
  • 基于Flink的用户画像 OLAP 实时数仓统计分析
  • springmvc的入门案例
  • npm create vite@latest my-vue-app 解读
  • 前端面经 作用域和作用域链
  • 408考研逐题详解:2009年第10题
  • SQL常用操作大全:复制表、跨库查询、删除重复数据
  • Andorid 文件打印功能
  • React 实现 JWT 登录验证的最小可运行示例
  • 计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 05.纹理贴图
  • Ubuntu 服务器管理命令笔记
  • 系统重装之后,通过ssh无法登录
  • 安卓基础(XML)
  • Vue2 中 el-dialog 封装组件属性不生效的深度解析(附 $attrs、inheritAttrs 原理)
  • DApp开发:开启去中心化应用新时代
  • LLaMA模型本地部署全攻略:从零搭建私有化AI助手
  • Algolia - Docsearch的申请配置安装【以踩坑解决版】
  • 2025年渗透测试面试题总结-某步在线面试(题目+回答)
  • 枚举 · 例8扩展-校门外的树:hard
  • 2025年APP安全攻防指南:抵御DDoS与CC攻击的实战策略