SpringBoot 项目中获取 Request 的四种方法

SpringBoot 项目中获取 Request 的四种方法

方法1、Controller中加参数来获取request

注意:只能在Controller中加入request参数。

一般,我们在Controller中加参数获取HttpServletRequest,如下所示:

@RestController
@RequestMapping("/gap")
public class PlantTraceController {@PostMapping("/plantTrace")public Result2 savePlantTraceInfo(@RequestBody JSONObject jsonObject, HttpServletRequest request) {String methodName = request.getHeader("methodName");....
}

该方法实现的原理是,在Controller方法开始处理请求时,Spring会将request对象赋值到方法参数中。此时request对象是方法参数,相当于局部变量,毫无疑问是线程安全的。

Controller中获取request对象后,如果要在其他方法中(如service方法、工具类方法等)使用request对象,需要在调用这些方法时将request对象作为参数传入。

优缺点

这种方法的主要缺点是request对象写起来冗余太多,主要体现在两点:

  1. 如果多个controller方法中都需要request对象,那么在每个方法中都需要添加一遍request参数
  2. request对象的获取只能从controller开始,如果使用request对象的地方在函数调用层级比较深的地方,那么整个调用链上的所有方法都需要添加request参数

实际上,在整个请求处理的过程中,request对象是贯穿始终的;也就是说,除了定时器等特殊情况,request对象相当于线程内部的一个全局变量。而该方法,相当于将这个全局变量,传来传去。

方法2、自动注入来获取request

注意:只能在Bean中注入request

@Controller
public class TestController{@Autowiredprivate HttpServletRequest request; //自动注入request@RequestMapping("/test")public void test() throws InterruptedException{//模拟程序执行了一段时间Thread.sleep(1000);}
}
优缺点

该方法的主要优点:

  1. 注入不局限于Controller中:在方法1中,只能在Controller中加入request参数。而对于方法2,不仅可以在Controller中注入,还可以在任何Bean中注入,包括Service、Repository及普通的Bean。
  2. 注入的对象不限于request:除了注入request对象,该方法还可以注入其他scope为request或session的对象,如response对象、session对象等;并保证线程安全。
  3. 减少代码冗余:只需要在需要request对象的Bean中注入request对象,便可以在该Bean的各个方法中使用,与方法1相比大大减少了代码冗余。

但是,该方法也会存在代码冗余。考虑这样的场景:web系统中有很多controller,每个controller中都会使用request对象(这种场景实际上非常频繁),这时就需要写很多次注入request的代码;如果还需要注入response,代码就更繁琐了。下面说明自动注入方法的改进方法,并分析其线程安全性及优缺点。

方法3:基类中自动注入(推荐)

注意:只能在Bean中注入request

与方法2相比,将注入部分代码放入到了基类中。

基类代码:

public class BaseController {@Autowiredprotected HttpServletRequest request;     
}
优缺点

与方法2相比,避免了在不同的Controller中重复注入request;但是考虑到java只允许继承一个基类,所以如果Controller需要继承其他类时,该方法便不再好用。

无论是方法2和方法3,都只能在Bean中注入request;如果其他方法(如工具类中static方法)需要使用request对象,则需要在调用这些方法时将request参数传递进去。下面介绍的方法4,则可以直接在诸如工具类中的static方法中使用request对象(当然在各种Bean中也可以使用)。

方法4:从RequestContextHolder中获取request

代码示例

@Controller
public class TestController {@RequestMapping("/test")public void test() throws InterruptedException {HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();// 模拟程序执行了一段时间Thread.sleep(1000);}
}
优缺点

优点:可以在非Bean中直接获取。缺点:如果使用的地方较多,代码非常繁琐;因此可以与其他方法配合使用。

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

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

相关文章

『 Linux 』进程优先级

文章目录 什么是优先级Linux下的进程优先级PRI与NI使用top查看进程以及对进程的优先级的修改 进程优先级的其他概念竞争性与独立性并发与并行 什么是优先级 优先级,顾名思义,即在同一环境下不同单位对同一个资源的享有顺序; 一般优先级高的单位将优先占有该资源; 在进程当中进…

Python中如何用栈实现队列

目录 一、引言 二、使用两个栈实现队列 三、性能分析 四、应用场景 五、代码示例 六、优缺点总结 一、引言 队列(Queue)和栈(Stack)是计算机科学中常用的数据结构。队列是一种特殊的线性表,只允许在表的前端进行…

Leetcode 380. O(1) 时间插入、删除和获取随机元素

文章目录 题目代码(11.28 首刷看解析) 题目 Leetcode 380. O(1) 时间插入、删除和获取随机元素 代码(11.28 首刷看解析) 1.length:表示的是数组的长度 数组 2.length():表示的是字符串的长度 字符串 3.size():表示的是集合中有多…

万宾科技可燃气体监测仪科技作用全览

燃气管网在运行过程中经常会遇到燃气管道泄漏的问题,燃气泄漏甚至会引起爆炸,从而威胁人民的生命和财产安全,因此对燃气管网进行定期巡检是十分必要的工作。但是传统的人工巡检已不能满足城市的需要,除了选择增加巡检人员之外&…

#Js篇:前端的设计模式有哪些

常见的前端设计模式 单例模式 保证一个类仅有一个实例,并提供一个访问他的全局访问点;vuex常用于管理全局状态、配置信息等。 工厂模式 一个用于创建对象的接口,让子类决定实例化哪个类; 创建复杂对象或对象的组合。 策略模…

Web UI自动化测试框架

WebUI automation testing framework based on Selenium and unittest. 基于 selenium 和 unittest 的 Web UI自动化测试框架。 特点 提供更加简单API编写自动化测试。提供脚手架,快速生成自动化测试项目。自动生成HTML测试报告生成。自带断言方法,断言…

笔记:Pika Labs 3D 动画生成工具

Pika Labs 一款3D 动画生成工具 本文地址:https://blog.csdn.net/qq_28550263/article/details/134657306 目 录 1. 简介2. 准备2.1 安装 discord2.2 加入 Discord 频道 3. Pika 使用指南2.1 快速开始2.2 从图像到视频2.3 Pika Bot按钮2.4 提示(Prompt&a…

Spark Streaming的基本数据流

先来介绍一下按照动静对数据的区分 静态数据 ​ 静态数据(Static Data)指的是在一段时间内不会或很少发生变化的数据。这种类型的数据通常是固定的,并且不会随着时间的推移而更新或仅偶尔更新。静态数据的典型例子包括配置文件、参考表、历…

面试题:说一下MyBatis动态代理原理?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.MyBatis简介2.使用步骤2.1、引入依赖2.2、配置文件2.3、接口定义2.4、加载执行 3.原理解析 1.MyBatis简介 MyBatis是一个ORM工具,封装了JDBC的操作&a…

Redis 主从架构,Redis 分区,Redis哈希槽的概念,为什么要做Redis分区

文章目录 Redis 主从架构redis replication 的核心机制redis 主从复制的核心原理过程原理Redis集群的主从复制模型是怎样的?生产环境中的 redis 是怎么部署的?机器是什么配置?你往内存里写的是什么数据?说说Redis哈希槽的概念&…

前端入门(四)Ajax、Promise异步、Axios通信、vue-router路由

文章目录 AjaxAjax特点 Promise 异步编程(缺)Promise基本使用状态 - PromiseState结果 - PromiseResult Axios基本使用 Vue路由 - vue-router单页面Web应用(single page web application,SPA)vue-router基本使用路由使…

Rabbitmq发送邮件并消费邮件

📑前言 本文主要是【Rabbitmq】——Rabbitmq发送邮件并消费邮件的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 &#x1…

jvm的相关知识点

Java Virtual Machine(JVM)是Java程序的运行环境,是Java技术的核心和关键之一。JVM负责执行Java字节码,并提供了一种平台无关性的执行环境,使得Java程序可以在不同的硬件和操作系统上运行。 下面是关于JVM的一些重要知…

spring应用在afterPropertiesSet方法中获取ApplicationContext

在afterPropertiesSet方法中获取ApplicationContext是可以的。Spring容器在初始化bean后,会自动调用afterPropertiesSet方法。在这个方法中,您可以获取到ApplicationContext对象。 以下是一个示例代码: import org.springframework.context…

【数学】旋转矩阵

参考链接 OpenGL from OpenGL.GL import * from OpenGL.GLUT import * from math import * import numpy as np def draw_axes():glClear(GL_COLOR_BUFFER_BIT)# 绘制坐标轴glColor3f(1.0, 1.0, 1.0) # 设置坐标轴颜色为白色glBegin(GL_LINES)glVertex2f(-1.0, 0.0) # x 轴g…

Python中使用matplotlib库绘图中如何给图形的图例设置中文字体显示

问题:当使用matplotlib绘图时遇到绘图,图例显示不出来中文字体 解决方式: 1)加载字体管理库 from matplotlib.font_manager import FontProperties 2)设置系统上字体的路径 font FontProperties(fname"C:\\W…

直线(蓝桥杯)

直线 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。 给定平面上 2 3 个…

VMD扩展molUP安装与高斯接口使用

molUP是一个VMD扩展,提供了一个简单的方式来加载和保存高斯文件,并分析相关的结果。 molUP为VMD提供了一个图形界面,用户可以加载和保存高斯文件格式的化学结构。这个扩展包括一组工具来设置高斯支持的任何计算,包括ONIOM通过互动…

静态内部类(内部类) - Java

静态内部类 StaticInnerClass01.java 说明:静态内部类是定义在外部类的成员位置,并且有static修饰 可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员。可以添加任意访问修饰符(public.protec…

计算机网络基础知识自用

示例: 域名如:alibaba.com (URL地址) IP地址为:xx.233.xxs.12 (访问) 端口:80 1.ip Internet Protocol Address,又译为网际协议地址,常见的IP地址分为IPv4与IPv6两大类。目前我们使用的都是IPv4的地址&am…