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博客

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

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

相关文章

【C++中日期类的实现】

一路&#xff0c;一路&#xff0c;一路从泥泞到风景............................................................................................... 目录 前言 一、【什么是日期类】 二、【代码实现】 1.【Date.h】部分&#xff1a; 2.【Date.cpp】部分&#xff1a;…

面试经典-32-判断子序列

题目 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一个子序列…

【图像生成】(四) Diffusion原理 pytorch代码实例

之前介绍完了图像生成网络GAN和VAE&#xff0c;终于来到了Diffusion。stable diffusion里比较复杂&#xff0c;同时用到了diffusion&#xff0c;VAE&#xff0c;CLIP等模型&#xff0c;这里我们主要着重介绍diffusion网络本身。 2.原理 Diffusion扩散模型从字面上来理解&#…

通用的springboot web jar包执行脚本,释放端口并执行jar包

1、通用的springboot web jar包执行脚本&#xff0c;释放端口并执行jar包&#xff1a; #!/bin/bash set -eDATE$(date %Y%m%d%H%M) # 基础路径 BASE_PATH/data/yitu-projects/yitu-xzhq/sftp # 服务名称。同时约定部署服务的 jar 包名字也为它。 SERVER_NAMEyitu-server # 环境…

C++从零开始(day52)——unordered_set,unordered_map学习使用

1.unordered系列关联式容器 C98中&#xff0c;STL提供了底层为红黑树结构的一系列容器&#xff0c;在查找时效率可以达到时间复杂度可以达到O(logN)&#xff0c;即红黑树的高度次&#xff0c;当树中的结点非常多时&#xff0c;查询效率也不理想&#xff0c;因此在C11中&#x…

代码随想录算法训练营第11天|20.有效的括号 1047.删除字符串中的所有相邻重复项

20.有效的括号 栈类的题目都很神奇&#xff0c;这道题分有不有效有三种情况&#xff0c;一种是左括号多了&#xff0c;一种是右括号多了&#xff0c;一种是左括号和右括号不匹配。我们设置一个栈来放s[i]所对应的右括号&#xff0c;如果s[i]‘{’&#xff0c;那么就在栈里放‘}…

大模型语言系列-Agent

文章目录 前言一、Agent是什么&#xff1f;二、LLM Agent1.西部世界小镇Agent2.BabyAGI3.AutoGPT4.Voyager Agent 总结 前言 自2022年ChatGPT诞生以来&#xff0c;LLM获得了收获了大量关注和研究&#xff0c;但究其根本&#xff0c;技术还是要为应用服务&#xff0c;如何将LLM…

Lua中文语言编程源码-第五节,更改lcorolib.c协程库函数, 使Lua加载中文库关键词(与所有的基础库相关)

源码已经更新在CSDN的码库里&#xff1a; git clone https://gitcode.com/funsion/CLua.git 在src文件夹下的lcorolib.c协程库函数&#xff0c;Coroutine Library&#xff1a;表明这个C源文件实现了Lua的协程库&#xff08;Coroutine Library&#xff09;&#xff0c;即提供了…

探索编程新纪元:Code GeeX、Copilot与通义灵码的智能辅助之旅

在人工智能技术日新月异的今天&#xff0c;编程领域的革新也正以前所未有的速度推进。新一代的编程辅助工具&#xff0c;如Code GeeX、Copilot和通义灵码&#xff0c;正在重塑开发者的工作流程&#xff0c;提升编程效率&#xff0c;并推动编程教育的普及。本文将深入探讨这三款…

Docker 镜像源配置

目录 一、 Docker 镜像源1.1 加速域名1.2 阿里云镜像源&#xff08;推荐&#xff09; 二、Docker 镜像源配置2.1 修改配置文件2.1.1 Docker Desktop 配置2.1.2 命令行配置 2.2 重启 Docker 服务2.2.1 Docker Desktop 重启2.2.2 命令行重启 2.3 检查是否配置成功 参考资料 一、 …

kubernetes-pod的调度

kubernetes-pod的调度 kubernetes-71、pod停止之后&#xff0c;服务不会停止2、pod endpoint service之间的关系3、pod的调度总述1. 资源请求&#xff08;Resource Requests&#xff09;和资源限制&#xff08;Resource Limits&#xff09;2. 节点选择器&#xff08;Node Selec…

Android 卸载系统自带APP

https://www.xda-developers.com/uninstall-carrier-oem-bloatware-without-root-access/ pm uninstall -k --user 0 NameOfPackage pm install-existing NameOfPackage you can simply use “adb shell cmd package install-existing ” in ADB and you’ll get the package…

ES6 Nunber类型、Math对象扩展

二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法&#xff0c;分别用前缀0b&#xff08;或0B&#xff09;和0o&#xff08;或0O&#xff09;表示。 0b111110111 503 // true 0o767 503 // true// 非严格模式 (function(){console.log(0o11 011); })() // true/…

RAxML-NG安装与使用-raxml-ng-v1.2.0(bioinfomatics tools-013)

01 背景 1.1 ML树 ML树&#xff0c;或最大似然树&#xff0c;是一种在进化生物学中用来推断物种之间进化关系的方法。最大似然&#xff08;Maximum Likelihood, ML&#xff09;是一种统计框架&#xff0c;用于估计模型参数&#xff0c;使得观察到的数据在该模型参数下的概率最…

SpringCloudAlibaba系列之Seata实战

目录 环境准备 1.下载seata安装包 2.修改配置文件 3.准备seata所需配置文件 4.初始化seata所需数据库 5.运行seata 服务准备 分布式事务测试 环境准备 1.下载seata安装包 Seata-Server下载 | Apache Seata 本地环境我们选择稳定版的二进制下载。 下载之后解压到指定目录…

网络分层架构(七/四层协议)详解

OSI七层模型和TCP/IP四层模型 业内普遍的分层方式有两种&#xff1a;OSI七层模型 和TCP/IP四层模型。记忆则为 “应表会传网数物” 关于协议&#xff1a; ① OSI七层模型详解 结构名 功能 主要设备 应用层 是最靠近用户的OSI层。用户接口、应用程序。应用层向应用进程展示…

基金养老怎么选?

养老分三大支柱&#xff0c;分别是基本养老金&#xff0c;企业年金&#xff0c;个人养老金。这里讲一下个人养老金如果靠基金如何来养老。 基金用来养老&#xff0c;分为三种&#xff0c;一中是养老目标基金&#xff0c;一种是高分红的基金&#xff0c;最后一种是有定期现金流的…

不同数据库中sql如何添加数据

在 SQL 中向数据库表中添加数据&#xff0c;通常使用 INSERT 语句。下面是各种主流数据库的代码案例&#xff0c;演示如何向表中添加数据&#xff1a; MySQL -- 向表中添加一行数据 INSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3);Pos…

try catch捕获异常,如果代码多了就显得冗余重复。我们可以用ControllerAdvice捕获全局异常变量处理

try catch捕获异常&#xff0c;如果代码多了就显得冗余重复。我们可以用ControllerAdvice捕获全局异常变量处理 比如重复重入unique数据&#xff0c;sql会报错 全局异常捕获 package com.itheima.reggie.common;import lombok.extern.slf4j.Slf4j; import org.springframework…

详解MySql索引

目录 一 、概念 二、使用场景 三、索引使用 四、索引存在问题 五、命中索引问题 六、索引执行原理 一 、概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。暂时可以理解成C语言的指针,文章后面详解 二、使用场景 数据量较大&#xff0c;且…