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è)方法都需要寫一遍
方法二: 自動(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
并沒有注入一個(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)行注入
方法三: 基類中自動(dòng)注入
本質(zhì)與方法二類似
public class BaseController { @Autowired protected HttpServletRequest request; }
- 線程安全
- 與方法2相比,避免了在不同的Controller中重復(fù)注入request
- 但是java只允許繼承一個(gè)基類
方法四: 手動(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)與方法一類似
總結(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)求失敗的問題解決方案
- 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的問題及解決
- SpringBoot如何切換成其它的嵌入式Servlet容器(Jetty和Undertow)
相關(guān)文章
PowerJob的DesignateServer工作流程源碼解讀
這篇文章主要介紹了PowerJob的DesignateServer工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01java?Map接口子類HashMap遍歷與LinkedHashMap詳解
這篇文章主要介紹了java?Map接口子類HashMap遍歷與LinkedHashMap詳解,Map接口下的集合與Collection接口下的集合,它們存儲(chǔ)數(shù)據(jù)的形式不同,感興趣的小伙伴可以參考下面文章詳細(xì)內(nèi)容介紹2022-06-06MybatisGenerator文件生成不出對(duì)應(yīng)文件的問題
本文介紹了使用MybatisGenerator生成文件時(shí)遇到的問題及解決方法,主要步驟包括檢查目標(biāo)表是否存在、是否能連接到數(shù)據(jù)庫(kù)、配置生成器的路徑等,通過(guò)在項(xiàng)目結(jié)構(gòu)中引入相應(yīng)的jar包,并在GeneratorSqlmap.java文件中運(yùn)行,可以成功生成對(duì)應(yīng)的文件2025-01-01使用Java的Graphics類進(jìn)行繪圖的方法詳解
這篇文章主要介紹了使用Java的Graphics類進(jìn)行繪圖的方法,是Java的GUI編程的基礎(chǔ),需要的朋友可以參考下2015-10-10Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件 FTP上傳下載管理模塊實(shí)現(xiàn)(11)
這篇文章主要為大家詳細(xì)介紹了Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件,F(xiàn)TP本地文件管理模塊的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04springboot2如何禁用自帶tomcat的session功能
這篇文章主要介紹了springboot2如何禁用自帶tomcat的session功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11