网络学习(13)|Spring Boot中获取HTTP请求头(Header)内容的详细解析
文章目录
- 方法一:使用`HttpServletRequest`
- 实现原理
- 代码示例
- 优点
- 缺点
- 适用场景
- 方法二:使用`RequestContextHolder`
- 实现原理
- 代码示例
- 优点
- 缺点
- 适用场景
- 方法三:使用`@RequestHeader`注解
- 实现原理
- 代码示例
- 优点
- 缺点
- 适用场景
- 总结
在Spring Boot应用中,获取HTTP请求头(Header)信息是常见的需求,Spring提供了多种机制来实现这一功能。下面将详细解析每种方法的实现原理、优缺点及适用场景。
方法一:使用HttpServletRequest
实现原理
HttpServletRequest接口是Servlet API的一部分,它封装了客户端发送到服务器的请求信息。通过注入HttpServletRequest对象,可以直接调用其getHeader方法获取特定的请求头信息。
代码示例
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HeaderController {private final HttpServletRequest request;public HeaderController(HttpServletRequest request) {this.request = request;}@GetMapping("/headers")public String getHeader() {String headerValue = request.getHeader("My-Header");return headerValue;}
}
优点
- 全面性: 可以访问
HttpServletRequest的所有功能,包括获取参数、Cookie、Session等。 - 直观: 直接使用Servlet API,对于熟悉Servlet的开发者来说非常直接。
缺点
- 耦合性: 控制器类与
HttpServletRequest耦合,增加了测试难度。 - 代码冗余: 在多处需要获取相同的Header时,代码重复。
适用场景
- 当需要访问
HttpServletRequest的其他功能时,如读取参数、Cookie等。 - 对于复杂的应用逻辑,需要更精细的请求控制。
方法二:使用RequestContextHolder
实现原理
RequestContextHolder是Spring Web MVC提供的工具类,用于存储当前线程的请求信息。通过RequestContextHolder.getRequestAttributes()可以获取当前请求的ServletRequestAttributes,进而访问HttpServletRequest。
代码示例
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HeaderController {@GetMapping("/headers")public String getHeader() {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();String headerValue = request.getHeader("My-Header");return headerValue;}
}
优点
- 减少耦合: 不需要直接注入
HttpServletRequest,降低了控制器与其他组件的耦合度。 - 灵活性: 可以在任何需要的地方获取请求信息,而不仅仅是控制器中。
缺点
- 复杂性: 实现方式较为间接,对初学者来说理解成本较高。
- 异常处理: 如果请求上下文未正确设置,可能抛出
NullPointerException。
适用场景
- 当需要在非控制器类中访问请求信息时。
- 希望降低控制器与其他组件之间的耦合度。
方法三:使用@RequestHeader注解
实现原理
@RequestHeader是Spring MVC提供的注解,用于自动绑定HTTP请求头到方法参数。Spring会自动从请求头中读取指定名称的值,并将其转换为对应类型,然后传递给方法参数。
代码示例
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HeaderController {@GetMapping("/headers")public String getHeader(@RequestHeader("My-Header") String headerValue) {return headerValue;}
}
优点
- 简洁性: 最简洁的实现方式,代码易于阅读和维护。
- 默认值支持: 可以设定默认值,当请求头不存在时使用默认值。
缺点
- 功能限制: 仅限于获取请求头信息,无法访问
HttpServletRequest的其他功能。 - 异常处理: 如果请求头必须存在但实际未提供,会导致400错误响应。
适用场景
- 对性能有高要求的场景,希望代码尽可能简洁。
- 请求头信息简单,不需要复杂的逻辑处理。
总结
- 使用
HttpServletRequest适合需要访问更多请求细节的场景,但增加了耦合性和代码冗余。 RequestContextHolder提供了灵活性和低耦合,但在理解和实现上较为复杂。@RequestHeader是最简洁的解决方案,适用于大多数情况,特别是当只需要简单获取请求头信息时。
选择哪种方法取决于具体的应用场景和需求。在实际开发中,理解每种方法的工作原理及其优缺点,将有助于做出最合适的选择。
相关文章:
网络学习(13)|Spring Boot中获取HTTP请求头(Header)内容的详细解析
文章目录 方法一:使用HttpServletRequest实现原理代码示例优点缺点适用场景 方法二:使用RequestContextHolder实现原理代码示例优点缺点适用场景 方法三:使用RequestHeader注解实现原理代码示例优点缺点适用场景 总结 在Spring Boot应用中&am…...
【漏洞复现】宏景eHR pos_dept_post SQL注入漏洞
0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合,满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR pos_dept_post 接囗处存在SQL注入漏洞,未经过身份认证的远程攻击者利用此漏洞执行任意SQL指令,…...
82. 删除排序链表中的重复元素 and II
链接直达: 保留重复元素 不保留重复元素 题目: 1: 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例 1:输入:head [1,1,2] 输出:[1…...
C++ 判断目标文件是否被占用(独占)(附源码)
在IM软件中发起文件发送时,如果要发送的是某word文件,并且该word文件被office打开,则会提示文件正在被占用无法发送,如下所示: 那文件被占用到底是如何判断出来的呢?其实很简单,调用系统API函数CreateFile,打开该文件(OPEN_EXISTING),传入FILE_SHARE_READ共享读标记…...
计划任务 之 一次性的计划任务
计划任务 作用:定时自动完成特定的工作 计划任务的分类: (1)一次性的计划任务 例如下周三对系统的重要文件备份一次 (2)周期性重复计划任务 例如每天晚上12:00备份一次 一次性的任务计划:…...
非比较排序之计数排序
目录 一、什么是计数排序 二、思路 三、代码实现 一、什么是计数排序 计数排序是一种非比较型的排序算法,它通过统计待排序数据中每个元素出现的次数,然后根据这个次数来进行排序。计数排序的具体步骤如下: 首先找出待排序数据中的最大值…...
Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游ÿ…...
第7章 用户输入和 while 循环
第7章 用户输入和 while 循环 7.1 函数 input()的工作原理7.1.1 编写清晰的程序7.1.2 使用 int()来获取数值输入7.1.3 求模运算符 7.2 while 循环简介7.2.1 使用 while 循环7.2.2 让用户选择何时退出7.2.3 使用标志7.2.4 使用 break 退出循环7.2.5 在循环中使用 continue7.2.6 …...
xshell远程无法链接上VM的centos7
1、现象如下, 2.1解决办法:查证后发现这个默认的设置为vmnet0 2.2解决办法:重启win10的虚拟机网卡(先禁用再启用) 3.参考文章:Xshell连接不上虚拟机centos7_centos7的nat模式可以ping通网络,但是用xshell连…...
拥抱AI-图片学习中的卷积神经算法详解
一、定义 卷积神经算法(Convolutional Neural Networks, CNN)是深度学习领域中的一种重要算法,特别适用于处理图像相关的任务。以下是卷积神经算法的详细解释: 1. 基本概念 定义:卷积神经网络是一类包含卷积计算且具…...
超详解——深入详解Python基础语法——基础篇
目录 1 .语句和变量 变量赋值示例: 打印变量的值: 2. 语句折行 反斜杠折行示例: 使用括号自动折行: 3. 缩进规范 缩进示例: 4. 多重赋值(链式赋值) 多重赋值的应用: 5 .多…...
系统架构设计师【论文-2017年 试题2】: 论软件架构风格(包括写作要点和经典范文)
题目:论软件架构风格 (2017年 试题2) 软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。体系结构风格 定义一个系统家族,即一个体系结构定义一个词汇表和一组约束。词汇表中包含一些构件和 连接件类型ÿ…...
Spring Boot 事务传播机制详解
Spring Boot 事务传播机制详解 1. 事务传播机制概述 Spring Boot 中的事务传播机制用于处理多个事务方法之间相互调用时的事务行为,保证数据的完整性和一致性。当务传播机制定义了在调用一个事务方法时,当前事务该如何传播或传递。Spring Boot 中的事务…...
【机器学习】生成对抗网络 (Generative Adversarial Networks | GAN)
生成对抗网络 (Generative Adversarial Networks | GAN) 介绍 生成对抗网络 (Generative Adversarial Networks,简称GAN) 是一种强大的深度学习模型,用于生成具有逼真感的图像、音频和文本等内容。GAN 的核心理念是通过训练两个神经网络,生…...
[ADS信号完整性分析]深入理解IBIS AMI模型设计:从基础到实践
在高速数字设计领域,信号完整性(SI)分析对于确保系统性能至关重要。IBIS AMI(Algorithmic Model Interface)模型作为一种强大的工具,能够帮助设计师在系统层面上评估和优化SERDES(串行器/解串器…...
Plotly : 超好用的Python可视化工具
文章目录 安装:开始你的 Plotly 之旅基本折线图:简单却强大的起点带颜色的散点图:数据的多彩世界三维曲面图:探索数据的深度气泡图:让世界看到你的数据小提琴图:数据分布的优雅展现旭日图:分层数…...
Linux电话本的编写-shell脚本编写
该电话本可以实现以下功能 1.添加用户 2.查询用户 3.删除用户 4.展示用户 5.退出 代码展示: #!/bin/bash PHONEBOOKphonebook.txt function add_contact() { echo "Adding new contact..." read -p "Enter name: " name …...
蓝牙开发 基础知识
零、基础知识 0.1、Android 应用可通过 Bluetooth API 执行以下操作 扫描其他蓝牙设备查询本地蓝牙适配器的配对蓝牙设备建立 RFCOMM 通道通过服务发现连接到其他设备与其他设备进行双向数据传输管理多个连接 0.2、蓝牙进行通信的四大必需任务 设置蓝牙查找局部区域内的配对…...
QNX 7.0.0开发总结
1 QNX编译 1.1 基本概念 QNX可以直接使用Linux Makefile编译库和二进制,在Makefile文件中指定CCaarch64-unknown-nto-qnx7.0.0-g,或者CCx86_64-pc-nto-qnx7.0.0-g,保存退出后,运行source /qnx_sdk_path/qnxsdp-env.sh,…...
Golang使用讯飞星火AI接口
一、API申请 https://www.bilibili.com/video/BV1Yw411m7Rs/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 注册申请,需要在此页面获取appid、apisecret、apikey https://www.xfyun.cn/ https://console.xfyun.cn/ser…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
