SpringBoot獲取HttpServletRequest的3種方式總結(jié)
方法一: Controller中增加request參數(shù)
@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 { @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
(單例),也就是說在整個web
系統(tǒng)中,只有一個DemoRequestController
;但是其中注入的request
卻是線程安全的,原因在于:使用這種方式,當Bean
(本例的DemoRequestController
)初始化時,Spring
并沒有注入一個request
對象,而是注入了一個代理(proxy
);當Bean
中需要使用request
對象時,通過該代理獲取request
對象。 - 代理對象中用到了
ThreadLocal
, 因此request對象也是線程局部變量;這就保證了request
對象的線程安全性。 - 不限于
Controller
中,可以在任何地方進行注入 - 注入的對象不限于
request
:除了注入request
對象,該方法還可以注入其他scope
為request
或session
的對象,如HttpServletResponse
對象、HttpSession
對象等;并保證線程安全 - 如果
Controller
有很多,那么我們需要在每個Controller
里面進行注入
方法三: 基類中自動注入
本質(zhì)與方法二類似
public class BaseController { @Autowired protected HttpServletRequest request; }
- 線程安全
- 與方法2相比,避免了在不同的Controller中重復注入request
- 但是java只允許繼承一個基類
方法四: 手動調(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
中直接獲得 - 缺點與方法一類似
總結(jié)
獲取HttpServletRequest
共有三種方式
Controller
的方法增加HttpServletRequest
參數(shù)- 自動注入
建議使用繼承來減少代碼冗余
- 通過
RequestContextHolder.currentRequestAttributes()
手動獲取
適合在非Bean中獲取
到此這篇關(guān)于SpringBoot獲取HttpServletRequest的3種方式的文章就介紹到這了,更多相關(guān)SpringBoot獲取HttpServletRequest內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot集成WebServlet出現(xiàn)自定義servlet請求失敗的問題解決方案
- SpringBoot里使用Servlet進行請求的實現(xiàn)示例
- springboot掃描自定義的servlet和filter代碼詳解
- Springboot注入成員變量HttpServletRequest的原理分析
- SpringBoot3.1.2 引入Swagger報錯Type javax.servlet.http.HttpServletRequest not present解決辦法
- 解決IDEA啟動springboot項目報錯java.lang.ClassNotFoundException:?javax.servlet.ServletContext
- Springboot如何添加server.servlet.context-path相關(guān)使用
- SpringBoot項目找不到j(luò)avax.servlet.Filter的問題及解決
- SpringBoot如何切換成其它的嵌入式Servlet容器(Jetty和Undertow)
相關(guān)文章
PowerJob的DesignateServer工作流程源碼解讀
這篇文章主要介紹了PowerJob的DesignateServer工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01java?Map接口子類HashMap遍歷與LinkedHashMap詳解
這篇文章主要介紹了java?Map接口子類HashMap遍歷與LinkedHashMap詳解,Map接口下的集合與Collection接口下的集合,它們存儲數(shù)據(jù)的形式不同,感興趣的小伙伴可以參考下面文章詳細內(nèi)容介紹2022-06-06MybatisGenerator文件生成不出對應(yīng)文件的問題
本文介紹了使用MybatisGenerator生成文件時遇到的問題及解決方法,主要步驟包括檢查目標表是否存在、是否能連接到數(shù)據(jù)庫、配置生成器的路徑等,通過在項目結(jié)構(gòu)中引入相應(yīng)的jar包,并在GeneratorSqlmap.java文件中運行,可以成功生成對應(yīng)的文件2025-01-01Java語言實現(xiàn)簡單FTP軟件 FTP上傳下載管理模塊實現(xiàn)(11)
這篇文章主要為大家詳細介紹了Java語言實現(xiàn)簡單FTP軟件,F(xiàn)TP本地文件管理模塊的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04springboot2如何禁用自帶tomcat的session功能
這篇文章主要介紹了springboot2如何禁用自帶tomcat的session功能,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11