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卻是線程安全的,原因在于:使用這種方式,當(dāng)Bean(本例的DemoRequestController)初始化時,Spring并沒有注入一個request對象,而是注入了一個代理(proxy);當(dāng)Bean中需要使用request對象時,通過該代理獲取request對象。 - 代理對象中用到了
ThreadLocal, 因此request對象也是線程局部變量;這就保證了request對象的線程安全性。 - 不限于
Controller中,可以在任何地方進(jìn)行注入 - 注入的對象不限于
request:除了注入request對象,該方法還可以注入其他scope為request或session的對象,如HttpServletResponse對象、HttpSession對象等;并保證線程安全 - 如果
Controller有很多,那么我們需要在每個Controller里面進(jìn)行注入
方法三: 基類中自動注入
本質(zhì)與方法二類似
public class BaseController {
@Autowired
protected HttpServletRequest request;
}- 線程安全
- 與方法2相比,避免了在不同的Controller中重復(fù)注入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進(jìn)行請求的實現(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工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
java?Map接口子類HashMap遍歷與LinkedHashMap詳解
這篇文章主要介紹了java?Map接口子類HashMap遍歷與LinkedHashMap詳解,Map接口下的集合與Collection接口下的集合,它們存儲數(shù)據(jù)的形式不同,感興趣的小伙伴可以參考下面文章詳細(xì)內(nèi)容介紹2022-06-06
MybatisGenerator文件生成不出對應(yīng)文件的問題
本文介紹了使用MybatisGenerator生成文件時遇到的問題及解決方法,主要步驟包括檢查目標(biāo)表是否存在、是否能連接到數(shù)據(jù)庫、配置生成器的路徑等,通過在項目結(jié)構(gòu)中引入相應(yīng)的jar包,并在GeneratorSqlmap.java文件中運行,可以成功生成對應(yīng)的文件2025-01-01
使用Java的Graphics類進(jìn)行繪圖的方法詳解
這篇文章主要介紹了使用Java的Graphics類進(jìn)行繪圖的方法,是Java的GUI編程的基礎(chǔ),需要的朋友可以參考下2015-10-10
Java語言實現(xiàn)簡單FTP軟件 FTP上傳下載管理模塊實現(xiàn)(11)
這篇文章主要為大家詳細(xì)介紹了Java語言實現(xiàn)簡單FTP軟件,F(xiàn)TP本地文件管理模塊的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
springboot2如何禁用自帶tomcat的session功能
這篇文章主要介紹了springboot2如何禁用自帶tomcat的session功能,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

