当前位置: 首页 > news >正文

【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中,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.lryc.cn/news/64255.html

相关文章:

  • k8s DCGM GPU采集指标项说明
  • 从线程安全到锁粒度,使用Redis分布式锁的注意事项
  • CopyOnWriteArrayList 的底层原理与多线程注意事项
  • 互斥锁深度理解与使用
  • Elasticsearch --- 数据聚合、自动补全
  • Haproxy搭建web群集
  • Packet Tracer - 配置和验证小型网络
  • Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机设备的各种固件信息如DeviceID或者SerialNumber等(C++)
  • java 的参数传递
  • 【面试长文】HashMap的数据结构和底层原理以及在JDK1.6、1.7和JDK8中的演变差异
  • 【25】linux进阶——网络文件系统NFS
  • JAVA入坑之JAVADOC(Java API 文档生成器)与快速生成
  • React | React组件化开发
  • 云计算的优势与未来发展趋势
  • shell编程lesson01
  • 看看人家的MyBatis批量插入数据优化,从120s到2.5s,那叫一个优雅!
  • 软件和信息服务业专题讲座
  • 由 ChatGPT 团队开发,堪称辅助神器!IntelliJ IDEA 神级插件
  • spass modeler
  • kafka的push、pull分别有什么优缺点
  • 【Canvas入门】从零开始在Canvas上绘制简单的动画
  • 【技术整合】各技术解决方案与对应解决的问题
  • 公网远程访问公司内网象过河ERP系统「内网穿透」
  • Win11的两个实用技巧系列之修改c盘大小方法、功能快捷键大全
  • 离散数学下--- 代数系统
  • java基础入门-04
  • 《面试1v1》java反射
  • 【C语言】struct结构体
  • Docker代码环境打包
  • 现代CMake高级教程 - 第 6 章:输出与变量