Spring Boot框架中在Controller方法里获取Request和Response对象的2种方式

news/2025/12/3 20:07:31/文章来源:https://www.cnblogs.com/nuccch/p/19303830

写在前面

javax.servlet.ServletRequestjavax.servlet.ServletResponse都是Servlet容器中定义的接口,分别用于获取客户端请求信息和将响应消息发送给客户端。
有两种方法在Contoller方法中获取它们:

  1. 直接在Controller方法参数中声明
  2. 通过工具类org.springframework.web.context.request.RequestContextHolder获取

实际的对象实例类跟具体的Servlet容器有关:

  • 如果Servlet容器为Tomcat,javax.servlet.ServletRequest实现类为org.apache.catalina.connector.RequestFacadejavax.servlet.ServletResponse实现类为org.apache.catalina.connector.ResponseFacade
  • 如果Servlet容器为Undertow,javax.servlet.ServletRequest实现类为io.undertow.servlet.spec.HttpServletRequestImpljavax.servlet.ServletResponse实现类为io.undertow.servlet.spec.HttpServletResponseImpl

在Controller方法参数中声明

可以直接在Controller方法参数中声明javax.servlet.ServletRequestjavax.servlet.ServletResponse对象,如下示例:

@GetMapping("/hello")
public String request(HttpServletRequest req, HttpServletResponse resp) {System.out.println("req: " + req);System.out.println("resp: " + resp);return "Success";
}

之所以能直接在Controller方法参数中声明javax.servlet.ServletRequestjavax.servlet.ServletResponse对象,实际上是在org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues()方法中进行了解析处理,如下:

// org.springframework.web.method.support.InvocableHandlerMethod
private Object[] getMethodArgumentValues(NativeWebRequest request, ModelAndViewContainer mavContainer,Object... providedArgs) throws Exception {MethodParameter[] parameters = getMethodParameters();Object[] args = new Object[parameters.length];for (int i = 0; i < parameters.length; i++) {MethodParameter parameter = parameters[i];parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);args[i] = resolveProvidedArgument(parameter, providedArgs);if (args[i] != null) {continue;}if (this.argumentResolvers.supportsParameter(parameter)) { // 判断是否为支持解析的参数类型try {args[i] = this.argumentResolvers.resolveArgument( // 解析参数对象parameter, mavContainer, request, this.dataBinderFactory);continue;}catch (Exception ex) {if (logger.isDebugEnabled()) {logger.debug(getArgumentResolutionErrorMessage("Failed to resolve", i), ex);}throw ex;}}if (args[i] == null) {throw new IllegalStateException("Could not resolve method parameter at index " +parameter.getParameterIndex() + " in " + parameter.getMethod().toGenericString() +": " + getArgumentResolutionErrorMessage("No suitable resolver for", i));}}return args;
}

最终通过org.springframework.web.servlet.mvc.method.annotation.ServletRequestMethodArgumentResolver.resolveArgument()方法解析获取到具体对象。

通过RequestContextHolder工具类获取

在使用Spring Boot框架时,除了可以直接在Controller方法参数中声明javax.servlet.ServletRequestjavax.servlet.ServletResponse对象,还可以通过工具类org.springframework.web.context.request.RequestContextHolder获取,如下示例:

@GetMapping("/hello")
public String hello() {RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();if (requestAttributes != null && requestAttributes instanceof ServletRequestAttributes) {ServletRequestAttributes httpRequestAttributes = (ServletRequestAttributes) requestAttributes;HttpServletRequest req = httpRequestAttributes.getRequest();HttpServletResponse resp = httpRequestAttributes.getResponse();System.out.println("req: " + req);System.out.println("resp: " + resp);}return "Success";
}

之所以可以通过RequestContextHolder工具类获取javax.servlet.ServletRequestjavax.servlet.ServletResponse对象,是因为在org.springframework.web.servlet.FrameworkServlet.processRequest()方法中进行了注入。

// org.springframework.web.servlet.FrameworkServletprotected final void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 省略其他代码...// 在工具类RequestContextHolder中注入ServletRequest和ServletResponse对象initContextHolders(request, localeContext, requestAttributes);// 省略其他代码...
}

【参考】
Spring——Web作用域:RequestContextListener
springboot 整合 ServletRequestListener监听器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/985980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025煤炭氟氯测定仪TOP5权威推荐:精准检测选对品牌,奥

煤质环保检测领域中,氟氯测定仪作为判定煤炭环保合规性的核心设备,其精准度、耐用性直接影响检测结果与企业生产效率。2024年行业数据显示,因氟氯测定仪检测偏差导致的环保合规风险事件占煤质检测问题的30%,而耐用…

2025年上海办公室装修公司口碑排名:迎湖办公室装修实力可靠

办公室是企业的第二战场,从空间规划到材料环保,每一处细节都关乎员工效率与品牌形象。面对市场上良莠不齐的装修公司,企业主常常陷入承诺与现实不符的困境:报价藏增项、工期拖延、材料不环保等问题频发。2025年办公…

Scrum 冲刺博客_4

Scrum 冲刺博客_4 站立式会议照片:昨天已完成工作:团队共同敲定数据接口规范 v1.0,明确了所有核心接口的参数、返回格式及异常码。 前端组基于接口规范,完成了前端请求封装的 TypeScript 类型声明,搭建了 Axios 请…

第五天项目

苍穹外卖项目 - 第5天冲刺日志 日期:2025-11-30 冲刺周期:第5天/共7天 会议时间:09:00 - 09:15 会议地点:开发室 参会人员:李靖华 温尚熙 谢斯越 郑哲磊一、站立会议照片团队成员正在讨论数据统计功能的实现细节二…

[豪の算法奇妙冒险] 代码随想录算法训练营第十四天 | 翻转二叉树、对称二叉树、二叉树的最大深度、二叉树的最小深度

翻转二叉树、对称二叉树、二叉树的最大深度、二叉树的最小深度代码随想录算法训练营第十四天 | 翻转二叉树、对称二叉树、二叉树的最大深度、二叉树的最小深度翻转二叉树题目链接:https://leetcode.cn/problems/inver…

团队作业4——7天敏捷冲刺

项目冲刺这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13483这个作业…

JAX 训练加速指南:8 个让 TPU 满跑的工程实战习惯

TPU 训练的真实效率往往取决于两个核心要素:Shape 的稳定性与算子的融合度。 很多时候,JAX 任务之所以出现严重的性能瓶颈,并非算法本身设计有问题,而是忽视了 XLA 编译器与底层硬件对“确定性”的极度偏好。基于大…

251202 模拟测 总结

挂分惨烈(? 我 T1 的 \(5\) 分呢。 Pro.A对,所以为什么你 \(Ans\) 的初值不设为 \(n+1\),为什么。我问你呢你明明知道有负数啊!!!1111(崩溃通过十分严谨的证明大力瞎猜结论,我们发现,将 \(a\) 升序排序后,最…

【小题狂练A】“一切沉溺者挣扎者向所谓极致献出 最稚嫩的人格”

题单:https://www.luogu.com.cn/training/911686#information P14635 [NOIP2025] 糖果店 / candy(民间数据) 我们考虑进行贪心,对于每个选取 \(b_i\) 的情况必然连带着 \(a_i\) 一起选取,也就是我们把 \(a_i+b_i\…

第三天项目

苍穹外卖项目 - 第3天冲刺日志 日期:2025-11-28 冲刺周期:第3天/共7天 参与人员:李靖华 温尚熙 谢斯越 郑哲磊一、站立会议照片二、会议内容记录 郑哲磊(后端负责人) 昨天已完成的工作:✅ [WI-017] 完成员工管理…

第7篇Scrum冲刺博客

第7篇Scrum冲刺博客这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/13…

2025年中国温度传感器主流品牌五大推荐:看哪家品牌适合实验

本榜单依托工业传感器市场全维度调研与真实客户口碑,聚焦实验室高精度需求、日本品牌技术特性、物流温控场景痛点三大核心方向,深度筛选出五家适配性标杆企业,为不同行业企业选型提供客观依据,助力精准匹配专业传感…

递归算法设计与实现 - Invinc

递归(Recursion)是一种通过函数调用自身来解决问题的方法。要正确设计和实现递归算法,必须满足 **递归三要素**,否则可能导致无限递归、栈溢出或逻辑错误。递归(Recursion)是一种通过函数调用自身来解决问题的方…

第二天项目

苍穹外卖项目 - 第2天冲刺日志 日期:2025-11-27 冲刺周期:第2天/共7天 参与人员:李靖华 温尚熙 谢斯越 郑哲磊 二、会议内容记录 郑哲磊(后端负责人) 昨天已完成的工作:✅ [WI-001] 搭建Spring Boot项目基础架构…

惊呆了!这个小脚本竟然同时搞定计算、进制转换和BMI计算

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

一些md5绕过总结(长期补充)

一些md5相关的track总结(长期) ffifdyop——绕过中一个奇妙的字符串 ffifdyop经过md5加密后为:276f722736c95d99e921722cf9ed621c 再转换为字符串:or’6<乱码> 即 or’66�]��!r,��b 用途: select * fro…

2025年西南五大诚信的加拿大移民企业推荐,看哪家售后服务优

在全球化浪潮下,移民加拿大成为许多家庭寻求更好发展的重要选择。然而,面对移民市场的复杂性与政策变动,选择一家诚信可靠、售后完善的加拿大移民专业公司至关重要。以下依据不同服务特色,为你推荐2025年西南地区十…

C语言随堂笔记-1

C语言随堂笔记-1。对应课程是:BV1Vm4y1r7jY 中的1-6分集。对应课程是:BV1Vm4y1r7jY 中的1-6分集。 1)IDE。这里我选择的是Windows中的Visual Studio 2026。 .h文件为头文件。 .c文件为源文件。2)在VS中创建新的C文件…

第3篇Scrum冲刺博客

第3篇Scrum冲刺博客这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/13…

Pytorch基础学习和实战,基于b站小土堆视频笔记 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …