SpringBoot獲取HttpServletRequest的3種方式總結(jié)
方法一: Controller中增加request參數(shù)
@RestController
public class DemoController {
@RequestMapping("/demo")
public void demo(HttpServletRequest request) {
System.out.println(request.getParameter("hello"));
}
}- 線程安全
- 缺點(diǎn): 每個(gè)方法都需要寫(xiě)一遍
方法二: 自動(dòng)注入
@Slf4j
@RequestMapping(path = "/request")
@RestController
public class DemoRequestController {
@Resource
private 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(單例),也就是說(shuō)在整個(gè)web系統(tǒng)中,只有一個(gè)DemoRequestController;但是其中注入的request卻是線程安全的,原因在于:使用這種方式,當(dāng)Bean(本例的DemoRequestController)初始化時(shí),Spring并沒(méi)有注入一個(gè)request對(duì)象,而是注入了一個(gè)代理(proxy);當(dāng)Bean中需要使用request對(duì)象時(shí),通過(guò)該代理獲取request對(duì)象。 - 代理對(duì)象中用到了
ThreadLocal, 因此request對(duì)象也是線程局部變量;這就保證了request對(duì)象的線程安全性。 - 不限于
Controller中,可以在任何地方進(jìn)行注入 - 注入的對(duì)象不限于
request:除了注入request對(duì)象,該方法還可以注入其他scope為request或session的對(duì)象,如HttpServletResponse對(duì)象、HttpSession對(duì)象等;并保證線程安全 - 如果
Controller有很多,那么我們需要在每個(gè)Controller里面進(jìn)行注入
方法三: 基類(lèi)中自動(dòng)注入
本質(zhì)與方法二類(lèi)似
public class BaseController {
@Autowired
protected HttpServletRequest request;
}- 線程安全
- 與方法2相比,避免了在不同的Controller中重復(fù)注入request
- 但是java只允許繼承一個(gè)基類(lèi)
方法四: 手動(dòng)調(diào)用
@Slf4j
@RequestMapping(path = "/request")
@RestController
public class DemoRequestController {
@Resource
private 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中直接獲得 - 缺點(diǎn)與方法一類(lèi)似
總結(jié)
獲取HttpServletRequest共有三種方式
Controller的方法增加HttpServletRequest參數(shù)- 自動(dòng)注入
建議使用繼承來(lái)減少代碼冗余
- 通過(guò)
RequestContextHolder.currentRequestAttributes()手動(dòng)獲取
適合在非Bean中獲取
到此這篇關(guān)于SpringBoot獲取HttpServletRequest的3種方式的文章就介紹到這了,更多相關(guān)SpringBoot獲取HttpServletRequest內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot集成WebServlet出現(xiàn)自定義servlet請(qǐng)求失敗的問(wèn)題解決方案
- SpringBoot里使用Servlet進(jìn)行請(qǐng)求的實(shí)現(xiàn)示例
- springboot掃描自定義的servlet和filter代碼詳解
- Springboot注入成員變量HttpServletRequest的原理分析
- SpringBoot3.1.2 引入Swagger報(bào)錯(cuò)Type javax.servlet.http.HttpServletRequest not present解決辦法
- 解決IDEA啟動(dòng)springboot項(xiàng)目報(bào)錯(cuò)java.lang.ClassNotFoundException:?javax.servlet.ServletContext
- Springboot如何添加server.servlet.context-path相關(guān)使用
- SpringBoot項(xiàng)目找不到j(luò)avax.servlet.Filter的問(wèn)題及解決
- SpringBoot如何切換成其它的嵌入式Servlet容器(Jetty和Undertow)
相關(guān)文章
SpringBoot中@PostConstruct 注解的實(shí)現(xiàn)
在Spring Boot框架中,?@PostConstruct是一個(gè)非常有用的注解,它用于在依賴(lài)注入完成后執(zhí)行初始化方法,本文將介紹?@PostConstruct的基本概念、使用場(chǎng)景以及提供詳細(xì)的代碼示例,感興趣的可以了解一下2024-09-09
Spring Boot應(yīng)用Docker化的步驟詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用Docker化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
Java 單鏈表數(shù)據(jù)結(jié)構(gòu)的增刪改查教程
這篇文章主要介紹了Java 單鏈表數(shù)據(jù)結(jié)構(gòu)的增刪改查教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
springboot項(xiàng)目引入外部jar包的詳細(xì)圖文教程
在項(xiàng)目中有時(shí)候需要引入外部jar包,啟動(dòng)運(yùn)行,下面這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目引入外部jar包的詳細(xì)圖文教程,需要的朋友可以參考下2023-09-09
Spring Boot 把配置文件和日志文件放到j(luò)ar外部
如果不想使用默認(rèn)的application.properties,而想將屬性文件放到j(luò)ar包外面,怎么做呢?下面小編給大家?guī)?lái)了兩種方法解決Spring Boot 把配置文件和日志文件放到j(luò)ar外部問(wèn)題,感興趣的朋友一起看看吧2018-02-02
SpringBoot配置項(xiàng)目訪問(wèn)路徑URL的根路徑方式
這篇文章主要介紹了SpringBoot配置項(xiàng)目訪問(wèn)路徑URL的根路徑方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
淺談mybatis-plus批量保存異常及效率優(yōu)化
本文主要介紹了mybatis-plus批量保存異常及效率優(yōu)化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
IDEA實(shí)現(xiàn)一鍵部署項(xiàng)目到服務(wù)器過(guò)程
本文介紹了在阿里云服務(wù)器上通過(guò)開(kāi)放2375端口、配置Docker及IDEA插件,實(shí)現(xiàn)項(xiàng)目打包、編寫(xiě)Dockerfile、構(gòu)建鏡像和容器,并最終通過(guò)瀏覽器訪問(wèn)部署服務(wù)的全過(guò)程2025-10-10
Java實(shí)現(xiàn)字節(jié)數(shù)組轉(zhuǎn)int(IEEE754標(biāo)準(zhǔn))的完整指南
在計(jì)算機(jī)科學(xué)中,IEEE 754 標(biāo)準(zhǔn)是浮點(diǎn)數(shù)表示的基石,本文將從 IEEE 754 的底層結(jié)構(gòu)出發(fā),結(jié)合 Java 平臺(tái)的特性,系統(tǒng)探討字節(jié)數(shù)組到 int 的轉(zhuǎn)換機(jī)制、IEEE 754 的語(yǔ)義映射、字節(jié)序的影響以及工程實(shí)踐中的關(guān)鍵考量2026-05-05

