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

SpringBoot中的HttpServletRequest

1.HttpServletRequest

        javax.servlet.http.HttpServletRequest是SUN制定的Servlet规范,是一个接口,表示请求, 其父接口是 javax.servlet.ServletRequest。“ HTTP 请求协议”的完整内容都被封装到 request对象中。

2.HttpServletRequest的生命周期

HttpServletRequest对象的生命周期是由Servlet容器来管理的,它会在每次HTTP请求到达服务器时创建一个新的HttpServletRequest对象,并将其传递给对应的Servlet进行处理。具体来说,它的生命周期包括以下几个阶段:

  1. 创建:当有新的HTTP请求到达服务器时,Servlet容器会根据请求信息创建一个新的HttpServletRequest对象,并将其作为参数传递给对应的Servlet进行处理。

  2. 处理:在Servlet中可以通过HttpServletRequest对象提取出请求中的相关信息,如请求参数、头部信息等,并进行相应处理。

  3. 销毁:当Servlet处理完该请求后,HttpServletRequest对象就会被销毁。在此过程中,容器会调用HttpServletRequest对象上定义的destroy()方法来清理资源。

3. 获取HttpServletRequest的方式

3.1 Controller方法上个参数

        在Controller的方法参数上写上HttpServletRequest,请求过来得到就是对应的HttpServletRequest


@GetMapping("/test")
public void test(HttpServletRequest request) {}

3.2 使用RequestContextHolder手动

        // 从请求上下文里获取Request对象ServletRequestAttributes requestAttributes = ServletRequestAttributes.class.cast(RequestContextHolder.getRequestAttributes());HttpServletRequest contextRequest = requestAttributes.getRequest();

​RequestContextHolder内部是使用ThreadLocal来维护Request的,线程间隔离,所以不存在线程安全问题,这样使用是没有问题的。 

3.3  使用@Autowired自动注入

    @AutowiredHttpServletRequest httpServletRequest;

虽然SpringBoot注入的全局变量是线程不安全的,但是使用@Autowired注入的HttpServletRequest确是线程安全的。通过对@Autowired分析发现还是使用RequestObjectFactory.getObject()返回的对象去处理了。而RequestObjectFactory.getObject()底层就是从RequestContextHolder的ThreadLocal变量requestAttributesHolder获取的。

4.修改HttpServletRequest的header值

        默认情况下HttpServletRequest是没有修改Header值得方法, 不过我们可以自定义类继承HttpServletRequestWrapper。

public class MyHeaderRequestWrapper extends HttpServletRequestWrapper{/*** construct a wrapper for this request** @param request*/public HeaderMapRequestWrapper(HttpServletRequest request) {super(request);}private Map<String, String> headerMap = new HashMap<>();/*** add a header with given name and value** @param name* @param value*/public void addHeader(String name, String value) {headerMap.put(name, value);}@Overridepublic String getHeader(String name) {String headerValue = super.getHeader(name);if (headerMap.containsKey(name)) {headerValue = headerMap.get(name);}return headerValue;}/*** get the Header names*/@Overridepublic Enumeration<String> getHeaderNames() {List<String> names = Collections.list(super.getHeaderNames());for (String name : headerMap.keySet()) {names.add(name);}return Collections.enumeration(names);}@Overridepublic Enumeration<String> getHeaders(String name) {List<String> values = Collections.list(super.getHeaders(name));if (headerMap.containsKey(name)) {values = Arrays.asList(headerMap.get(name));}return Collections.enumeration(values);}
}
//使用  
MyHeaderRequestWrapper requestWrapper = new MyHeaderRequestWrapper(httpServletRequest);
//添加或修改 header值requestWrapper.addHeader("Token", "token");

参考:

从Spring源码分析@Autowired注入的request是否线程安全_判断autowired request bound-CSDN博客

相关文章:

  • camunda 与 pycamunda学习
  • 51单片机-蜂鸣器
  • 【安全类书籍-2】Web渗透测试:使用Kali Linux
  • 深入理解Java中的TCP连接:三次握手和四次挥手
  • C++: 多态实现原理解析
  • 微信小程序项目实战遇到的问题
  • 详细分析Python模块中的雪花算法(附模板)
  • Django框架的全面指南:从入门到高级【第128篇—Django框架】
  • 24计算机考研调剂 | 温州大学
  • C# 连接neo4j数据库,包括非默认的neo4j默认库
  • 基于ssm+layui的图书管理系统
  • C语言分析基础排序算法——归并排序
  • jwt以及加密完善博客系统
  • 第八阶段:uni-app小程序 --首页开发(2)
  • macOS - 获取硬件设备信息
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【Linux系统编程】快速查找errno错误码信息
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Consul Config 使用Git做版本控制的实现
  • git 常用命令
  • Java 内存分配及垃圾回收机制初探
  • Laravel Mix运行时关于es2015报错解决方案
  • nginx 配置多 域名 + 多 https
  • vue的全局变量和全局拦截请求器
  • 从零搭建Koa2 Server
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 给Prometheus造假数据的方法
  • 记录一下第一次使用npm
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 配置 PM2 实现代码自动发布
  • 微信小程序开发问题汇总
  • 终端用户监控:真实用户监控还是模拟监控?
  • HanLP分词命名实体提取详解
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)php投票系统 毕业设计 121500
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (七)Java对象在Hibernate持久化层的状态
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (一)RocketMQ初步认识
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)Linq学习笔记
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)原始图像数据和PDF中的图像数据
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .Net 高效开发之不可错过的实用工具
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?