在SpringBoot項(xiàng)目中獲取Request的四種方法
SpringBoot 項(xiàng)目中獲取 Request 的四種方法
方法1、Controller中加參數(shù)來(lái)獲取request
注意:只能在Controller中加入request參數(shù)。
一般,我們?cè)贑ontroller中加參數(shù)獲取HttpServletRequest,如下所示:
@RestController @RequestMapping("/gap") public class PlantTraceController { @PostMapping("/plantTrace") public Result2 savePlantTraceInfo(@RequestBody JSONObject jsonObject, HttpServletRequest request) { String methodName = request.getHeader("methodName"); .... }
該方法實(shí)現(xiàn)的原理是,在Controller方法開(kāi)始處理請(qǐng)求時(shí),Spring會(huì)將request對(duì)象賦值到方法參數(shù)中。此時(shí)request對(duì)象是方法參數(shù),相當(dāng)于局部變量,毫無(wú)疑問(wèn)是線程安全的。
Controller中獲取request對(duì)象后,如果要在其他方法中(如service方法、工具類(lèi)方法等)使用request對(duì)象,需要在調(diào)用這些方法時(shí)將request對(duì)象作為參數(shù)傳入。
優(yōu)缺點(diǎn)
這種方法的主要缺點(diǎn)是request對(duì)象寫(xiě)起來(lái)冗余太多,主要體現(xiàn)在兩點(diǎn):
- 如果多個(gè)controller方法中都需要request對(duì)象,那么在每個(gè)方法中都需要添加一遍request參數(shù)
- request對(duì)象的獲取只能從controller開(kāi)始,如果使用request對(duì)象的地方在函數(shù)調(diào)用層級(jí)比較深的地方,那么整個(gè)調(diào)用鏈上的所有方法都需要添加request參數(shù)
實(shí)際上,在整個(gè)請(qǐng)求處理的過(guò)程中,request對(duì)象是貫穿始終的;也就是說(shuō),除了定時(shí)器等特殊情況,request對(duì)象相當(dāng)于線程內(nèi)部的一個(gè)全局變量。而該方法,相當(dāng)于將這個(gè)全局變量,傳來(lái)傳去。
方法2、自動(dòng)注入來(lái)獲取request
注意:只能在Bean中注入request
@Controller public class TestController{ @Autowired private HttpServletRequest request; //自動(dòng)注入request @RequestMapping("/test") public void test() throws InterruptedException{ //模擬程序執(zhí)行了一段時(shí)間 Thread.sleep(1000); } }
優(yōu)缺點(diǎn)
該方法的主要優(yōu)點(diǎn):
- 注入不局限于Controller中:在方法1中,只能在Controller中加入request參數(shù)。而對(duì)于方法2,不僅可以在Controller中注入,還可以在任何Bean中注入,包括Service、Repository及普通的Bean。
- 注入的對(duì)象不限于request:除了注入request對(duì)象,該方法還可以注入其他scope為request或session的對(duì)象,如response對(duì)象、session對(duì)象等;并保證線程安全。
- 減少代碼冗余:只需要在需要request對(duì)象的Bean中注入request對(duì)象,便可以在該Bean的各個(gè)方法中使用,與方法1相比大大減少了代碼冗余。
但是,該方法也會(huì)存在代碼冗余??紤]這樣的場(chǎng)景:web系統(tǒng)中有很多controller,每個(gè)controller中都會(huì)使用request對(duì)象(這種場(chǎng)景實(shí)際上非常頻繁),這時(shí)就需要寫(xiě)很多次注入request的代碼;如果還需要注入response,代碼就更繁瑣了。下面說(shuō)明自動(dòng)注入方法的改進(jìn)方法,并分析其線程安全性及優(yōu)缺點(diǎn)。
方法3:基類(lèi)中自動(dòng)注入(推薦)
注意:只能在Bean中注入request
與方法2相比,將注入部分代碼放入到了基類(lèi)中。
基類(lèi)代碼:
public class BaseController { @Autowired protected HttpServletRequest request; }
優(yōu)缺點(diǎn)
與方法2相比,避免了在不同的Controller中重復(fù)注入request;但是考慮到j(luò)ava只允許繼承一個(gè)基類(lèi),所以如果Controller需要繼承其他類(lèi)時(shí),該方法便不再好用。
無(wú)論是方法2和方法3,都只能在Bean中注入request;如果其他方法(如工具類(lèi)中static方法)需要使用request對(duì)象,則需要在調(diào)用這些方法時(shí)將request參數(shù)傳遞進(jìn)去。下面介紹的方法4,則可以直接在諸如工具類(lèi)中的static方法中使用request對(duì)象(當(dāng)然在各種Bean中也可以使用)。
方法4:從RequestContextHolder中獲取request
代碼示例
@Controller public class TestController { @RequestMapping("/test") public void test() throws InterruptedException { HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest(); // 模擬程序執(zhí)行了一段時(shí)間 Thread.sleep(1000); } }
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):可以在非Bean中直接獲取。缺點(diǎn):如果使用的地方較多,代碼非常繁瑣;因此可以與其他方法配合使用。
以上就是在SpringBoot項(xiàng)目中獲取Request的四種方法的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot獲取Request的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring事件監(jiān)聽(tīng)基本原理與使用詳解
這篇文章主要介紹了Spring事件監(jiān)聽(tīng)基本原理與使用詳解,Spring的事件監(jiān)聽(tīng)機(jī)制和發(fā)布訂閱機(jī)制是很相似的:發(fā)布了一個(gè)事件后,監(jiān)聽(tīng)該類(lèi)型事件的所有監(jiān)聽(tīng)器會(huì)觸發(fā)相應(yīng)的處理邏輯,需要的朋友可以參考下2024-01-01springboot啟動(dòng)掃描不到dao層接口的解決方案
這篇文章主要介紹了springboot啟動(dòng)掃描不到dao層接口的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07java開(kāi)發(fā)MyBatis中常用plus實(shí)體類(lèi)注解符詳解
這篇文章主要為大家介紹了java開(kāi)發(fā)MyBatis常用的plus實(shí)體類(lèi)注解符示例應(yīng)用詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10idea 查看一個(gè)類(lèi)的所有子類(lèi)以及子類(lèi)的子類(lèi)并以層級(jí)關(guān)系顯示
這篇文章主要介紹了idea 查看一個(gè)類(lèi)的所有子類(lèi)以及子類(lèi)的子類(lèi)并以層級(jí)關(guān)系顯示,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Java 對(duì)接飛書(shū)多維表格使用詳解(微服務(wù))
本文詳細(xì)介紹了如何基于飛書(shū)開(kāi)放平臺(tái)在微服務(wù)項(xiàng)目中操作飛書(shū)多維表格,包括應(yīng)用創(chuàng)建、授權(quán)、多維表數(shù)據(jù)操作(新增、查詢、刪除)以及Java SDK實(shí)現(xiàn)等步驟,感興趣的朋友跟隨小編一起看看吧2024-12-12springboot配置templates直接訪問(wèn)的實(shí)現(xiàn)
這篇文章主要介紹了springboot配置templates直接訪問(wèn)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12JAVA之讀取properties時(shí)路徑的注意問(wèn)題
這篇文章主要介紹了JAVA之讀取properties時(shí)路徑的注意問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08ScheduledExecutorService任務(wù)定時(shí)代碼示例
這篇文章主要介紹了ScheduledExecutorService任務(wù)定時(shí)代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01