【SpringBoot】获取HttpServletRequest的三种方式

news/2024/10/22 17:37:35/

方法一: 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中,DemoRequestControllerscopesingleton(单例),也就是说在整个web系统中,只有一个DemoRequestController;但是其中注入的request却是线程安全的,原因在于:使用这种方式,当Bean(本例的DemoRequestController)初始化时,Spring并没有注入一个request对象,而是注入了一个代理(proxy);当Bean中需要使用request对象时,通过该代理获取request对象。
  • 代理对象中用到了 ThreadLocal , 因此request对象也是线程局部变量;这就保证了request对象的线程安全性。
  • 不限于Controller中,可以在任何地方进行注入
  • 注入的对象不限于request:除了注入request对象,该方法还可以注入其他scoperequestsession的对象,如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中获取


http://www.ppmy.cn/news/57483.html

相关文章

spass modeler

课时1:SPSS Modeler 简介 本课时一共分为五个模块,分别是Modeler概述、工具安装、窗口说明以及功能介绍和应用案例。相信通过本课时内容的学习,大家将会对SPSS Modeler有个基础的了解. 在学习本节课内容之前,先来看看本节课我们究…

使用 ESP32 设计智能手表第 2 部分 - 环境光和心率传感器

我们研究了如何为我们的智能手表项目制作一些有趣的表盘。在这一部分中,我们将研究如何将一些传感器连接到我们的智能手表,并将连接 BH1750 环境光传感器和 MAX30102 心率传感器。我们将分别研究这些模块中的每一个的接口。 先决条件——安装必要的库 本文下方提供的 GitHub …

改进YOLOv5/YOLOv8:(创新必备)全新注意力机制DAED-Conv | 高效轻量化注意力下采样 | 大幅降低参数量的同时增加模型精度。

@TOC 自研轻量化注意力下采样机制,在yolov5s的基础下,大幅降低参数量和计算量,并行人检测数据训练中涨点!。 理论介绍 这个模块是一个基于Deformable Convolution的通道注意力(CA)卷积层。它结合了通道注意力机制和可变形卷积来提高卷积神经网络的性能。以下是关于这个…

C++动态规划模板汇总大全

前言 如果你不太了解dp(动态规划)是个什么东西,请回到上次dp。 链接:动态规划算法详解 数字三角形模型 问题 A: 【一本通基础DP基础模型】【例9.2】数字金字塔 【题目描述】 观察下面的数字金字塔。写一个程序查找从最高点到…

验证回文串

题目:验证回文串 思路: 这段代码是一个判断字符串是否为回文的函数。它接受一个 string 类型的参数 s,并依次执行两个步骤: 首先对字符串进行预处理: 将大写字母转换成小写字母;移除非字母数字字符。 然…

一起来说说,IT行业里,哪些技术更热门

内容: 对比分析市场上IT行业热门技术;调查了解不同公司对热门技术的需求情况;分析热门技术的优缺点和未来发展趋势;提出对公司IT技术发展的建议。 详情: 一、对比分析市场上IT行业热门技术: 通过对比分…

平时很少使用的c和c++语法逻辑

1. goto语句 example&#xff1a; #include<stdio.h> #include<stdlib.h> int main(){ string hello""; string world""; while(cin>>hello){ goto Tiaoshu; } Tiaoshu: cout<<"hellow world!"<<endl; …

【算法】最容易懂得的红黑树

红黑树是一个平衡的二叉树&#xff0c;但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束&#xff0c;但是这样在动态插入中保持树的完美平衡代价太高&#xff0c;所以&#xff0c;我们稍微放松逛一下限制&#xff0c;希望找到一个能在对数时间内完…