【SpringBoot】获取HttpServletRequest的三种方式
方法一: Controller中增加request参数
@RestController
public class DemoController { @RequestMapping("/demo")public void demo(HttpServletRequest request) { System.out.println(request.getParameter("hello"));}
}
- 线程安全
- 缺点: 每个方法都需要写一遍
方法二: 自动注入
@Slf4j
@RequestMapping(path = "/request")
@RestController
public class DemoRequestController {@Resourceprivate HttpServletRequest request1;@RequestMapping(path = "/demo")public String demo(HttpServletRequest request2) {log.info("request1: {}", request1.getClass());log.info("request2: {}", request2.getClass());return "Hello, world!";}
}
- 线程安全
- 在
Spring中,DemoRequestController的scope是singleton(单例),也就是说在整个web系统中,只有一个DemoRequestController;但是其中注入的request却是线程安全的,原因在于:使用这种方式,当Bean(本例的DemoRequestController)初始化时,Spring并没有注入一个request对象,而是注入了一个代理(proxy);当Bean中需要使用request对象时,通过该代理获取request对象。 - 代理对象中用到了
ThreadLocal, 因此request对象也是线程局部变量;这就保证了request对象的线程安全性。 - 不限于
Controller中,可以在任何地方进行注入 - 注入的对象不限于
request:除了注入request对象,该方法还可以注入其他scope为request或session的对象,如HttpServletResponse对象、HttpSession对象等;并保证线程安全 - 如果
Controller有很多,那么我们需要在每个Controller里面进行注入
方法三: 基类中自动注入
本质与方法二类似
public class BaseController { @Autowired protected HttpServletRequest request;
}
- 线程安全
- 与方法2相比,避免了在不同的Controller中重复注入request
- 但是java只允许继承一个基类
方法四: 手动调用
@Slf4j
@RequestMapping(path = "/request")
@RestController
public class DemoRequestController {@Resourceprivate HttpServletRequest request1;@RequestMapping(path = "/demo")public String demo(HttpServletRequest request2) {HttpServletRequest request3 = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();log.info("request1: {}", request1.getClass());log.info("request2: {}", request2.getClass());log.info("request3: {}", request3.getClass());return "Hello, world!";}
}
- 线程安全
- 可以在非
Bean中直接获得 - 缺点与方法一类似
总结
获取HttpServletRequest共有三种方式
Controller的方法增加HttpServletRequest参数- 自动注入
建议使用继承来减少代码冗余
- 通过
RequestContextHolder.currentRequestAttributes()手动获取
适合在非Bean中获取
相关文章:
【SpringBoot】获取HttpServletRequest的三种方式
方法一: Controller中增加request参数 RestController public class DemoController { RequestMapping("/demo")public void demo(HttpServletRequest request) { System.out.println(request.getParameter("hello"));} }线程安全缺点: 每个方法都…...
k8s DCGM GPU采集指标项说明
dcgm-exporter 采集指标项 指标解释dcgm_fan_speed_percentGPU风扇转速占比(%)dcgm_sm_clockGPU sm 时钟(MHz)dcgm_memory_clockGPU 内存时钟(MHz)dcgm_gpu_tempGPU 运行的温度(℃)dcgm_power_usageGPU 的功率(w)dcgm_pcie_tx_throughputGPU PCIeTX 传输的字节总数 (kb)dcgm_pc…...
从线程安全到锁粒度,使用Redis分布式锁的注意事项
关于 Redis 的分布式锁 在分布式的场景下,多个服务器之间的资源竞争和访问频繁性,为了数据的安全和性能的优化,我们需要引入分布式锁的概念,这把锁可以加在上层业务需要的共享数据/资源上,能够同步协调多个服务器的访…...
CopyOnWriteArrayList 的底层原理与多线程注意事项
文章目录 CopyOnWriteArrayList 的底层原理与多线程注意事项1. CopyOnWriteArrayList 底层原理1.1 概念说明1.2 实现原理1.3 优点1.4 缺点 2. CopyOnWriteArrayList 多线程注意事项与实例2.1 注意事项2.2 示例2.2.1 示例代码 3. 总结 CopyOnWriteArrayList 的底层原理与多线程注…...
互斥锁深度理解与使用
大家好,我是易安! 我们知道一个或者多个操作在CPU执行的过程中不被中断的特性,称为“原子性”。理解这个特性有助于你分析并发编程Bug出现的原因,例如利用它可以分析出long型变量在32位机器上读写可能出现的诡异Bug,明明已经把变量…...
Elasticsearch --- 数据聚合、自动补全
一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这…...
Haproxy搭建web群集
一.常见的web集群调度器 1、目前常见的web集群调度器分为软件和硬件 2、软件通常使用开源的LVS、Haproxy、Nginx LVS 性能最好,但搭建复杂。Nginx并发量,性能低于Haproxy 3、硬件一般使用比较多的是F5,也有很多人使用国内的一些产品&a…...
Packet Tracer - 配置和验证小型网络
Packet Tracer - 配置和验证小型网络 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 RTA G0/0 10.10.10.1 255.255.255.0 不适用 G0/1 10.10.20.1 255.255.255.0 不适用 SW1 VLAN1 10.10.10.2 255.255.255.0 10.10.10.1 SW2 VLAN1 10.10.20.2 255.25…...
Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机设备的各种固件信息如DeviceID或者SerialNumber等(C++)
项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具…...
java 的参数传递
一、疑惑引入 首先,我们从一个例子来引出这个问题: public static void main(String[] args) throws IOException {List<String> mockList Lists.newArrayList("a", "b");System.out.println("1: " mockList);L…...
【面试长文】HashMap的数据结构和底层原理以及在JDK1.6、1.7和JDK8中的演变差异
文章目录 HashMap的数据结构和底层原理以及在JDK1.6、1.7和JDK8中的演变差异HashMap的数据结构和原理JDK1.6、1.7和1.8中的HashMap源码演变JDK1.6JDK1.7JDK1.8 总结自己实现一个简单的HashMapHashMap的时间复杂度分析HashMap的空间复杂度分析HashMap的应用场景HashMap的弊端及解…...
【25】linux进阶——网络文件系统NFS
大家好,这里是天亮之前ict,本人网络工程大三在读小学生,拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识,希望能提高自己的技术的同时,也可以帮助到大家 另外其它专栏请关注: 锐捷数通实验&…...
JAVA入坑之JAVADOC(Java API 文档生成器)与快速生成
目录 一、JAVADOC(Java API 文档生成器) 1.1概述 1.2Javadoc标签 1.3Javadoc命令 1.4用idea自带工具生成API帮助文档 二、IDEA如何生成get和set方法 三、常见快捷方式 3.1快速生成main函数 3.2快速生成println()语句 3.3快速生成for循环 3.4“…...
React | React组件化开发
✨ 个人主页:CoderHing 🖥️ React .js专栏:React .js React组件化开发 🙋♂️ 个人简介:一个不甘平庸的平凡人🍬 💫 系列专栏:吊打面试官系列 16天学会Vue 11天学会React Node…...
云计算的优势与未来发展趋势
一、前言二、云计算的基础概念2.1 云计算的定义2.2 云计算的发展历程2.3 云计算的基本架构2.4 云计算的主要服务模式 三、企业采用云计算的优势3.1 降低成本3.2 提高效率和灵活性3.3 提升信息系统的安全性和可靠性3.4 拥有更加丰富的应用和服务 四、行业应用案例4.1 金融行业4.…...
shell编程lesson01
命令行和脚本关系 命令行:单一shell命令,命令行中编写与执行; 脚本:众多shell命令组合成一个完成特定功能的程序,在脚本文件中进行编写维护。 脚本是一个文件,一个包含有一组命令的文件。 编写一个shel…...
看看人家的MyBatis批量插入数据优化,从120s到2.5s,那叫一个优雅!
粗略的实验 最后 最近在压测一批接口的时候,我发现接口处理速度比我们预期的要慢。这让我感到有点奇怪,因为我们之前已经对这些接口进行了优化。但是,当我们进行排查时,发现问题出在数据库批量保存这块。 我们的项目使用了 myb…...
软件和信息服务业专题讲座
软件和信息服务业专题讲座 单选题(共 10 题,每题 3 分) 1、根据本讲,我国要加强物联网应用领域()开发和应用。 A、大数据 2、根据本讲,要充分发挥软件对城市管理和惠民服务的(&am…...
由 ChatGPT 团队开发,堪称辅助神器!IntelliJ IDEA 神级插件
什么是Bito? 为什么要使用Bito? 如何安装Bito插件 如何使用Bito插件 什么是Bito? Bito是一款由ChatGPT团队开发的IntelliJ IDEA编辑器插件,旨在提高开发人员的工作效率。此插件强大之处在于它不仅可以帮助开发人员更快地提交…...
spass modeler
课时1:SPSS Modeler 简介 本课时一共分为五个模块,分别是Modeler概述、工具安装、窗口说明以及功能介绍和应用案例。相信通过本课时内容的学习,大家将会对SPSS Modeler有个基础的了解. 在学习本节课内容之前,先来看看本节课我们究…...
VirtIO-GPU虚拟化图形加速:从零构建到实战部署
1. VirtIO-GPU虚拟化图形加速入门指南 第一次接触VirtIO-GPU时,我完全被这个技术概念搞懵了。简单来说,它就像是在虚拟化环境中给每台虚拟机分配一个"虚拟显卡",让它们能共享物理显卡的3D加速能力。想象一下,你有一台强…...
告别玄学调音!手把手教你用Adobe Audition和杰里SDK搞定蓝牙音箱EQ
数据驱动的蓝牙音箱EQ调音实战:从频响分析到SDK参数优化 在音频产品开发中,音质调试往往被视为一门"玄学"——依赖工程师的"金耳朵"和经验积累。这种传统方法不仅效率低下,更难以保证结果的可重复性。本文将彻底改变这一…...
Jasminum:为中文研究者量身打造的Zotero智能文献管理解决方案
Jasminum:为中文研究者量身打造的Zotero智能文献管理解决方案 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 在中文学…...
仅限首批200家通过SITS2026容错认证的企业在用:AIAgent故障注入测试的8步标准化流程
更多请点击: https://intelliparadigm.com 第一章:SITS2026容错认证体系的演进逻辑与战略价值 SITS2026容错认证体系并非对传统安全模型的简单增强,而是面向高动态、强异构、多边协同数字基础设施所构建的第三代可信计算范式。其核心演进逻辑…...
Hitboxer:游戏键位重映射终极解决方案,告别操作冲突困扰
Hitboxer:游戏键位重映射终极解决方案,告别操作冲突困扰 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在激烈的游戏对战中,因为同时按下相反方向键而导致操作混乱&…...
自制编程语言:挑战与乐趣并存,10000 行 C++ 代码实现多项功能,未来规划丰富!
自制编程语言:比想象中容易,也更具挑战2026 年 5 月 6 日。去年 12 月中旬,作者开始打造自己的编程语言,目前距生产级质量有差距,但已编写约 1000 行代码的蒙特卡罗路径追踪器。项目暂停,作者分享相关内容。…...
Neat Bookmarks:重构浏览器书签管理的技术架构与实践方案
Neat Bookmarks:重构浏览器书签管理的技术架构与实践方案 【免费下载链接】neat-bookmarks A neat bookmarks tree popup extension for Chrome [DISCONTINUED] 项目地址: https://gitcode.com/gh_mirrors/ne/neat-bookmarks 开篇:数字信息过载时…...
OBS多路推流插件:突破单一平台限制,实现多平台直播同步的技术方案
OBS多路推流插件:突破单一平台限制,实现多平台直播同步的技术方案 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 在直播行业快速发展的今天,内容创作…...
如何用嘎嘎降AI处理农学论文:实验数据图表密集的农学毕业论文降AI完整操作教程
如何用嘎嘎降AI处理农学论文:实验数据图表密集的农学毕业论文降AI完整操作教程 关于农学论文降AI教程,有几个细节提前知道,能少走很多弯路。 核心用嘎嘎降AI(www.aigcleaner.com),4.8元,达标率…...
如何快速绕过iOS 15-16激活锁:AppleRa1n完整使用教程
如何快速绕过iOS 15-16激活锁:AppleRa1n完整使用教程 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 对于iOS设备用户来说,激活锁(Activation Lock)是一…...
