欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在SpringBoot項目中獲取Request的四種方法

 更新時間:2023年11月29日 09:38:39   作者:IDIOT___IDIOT  
這篇文章主要為大家詳細介紹了SpringBoot項目中獲取Request的四種方法,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以學習一下

SpringBoot 項目中獲取 Request 的四種方法

方法1、Controller中加參數(shù)來獲取request

注意:只能在Controller中加入request參數(shù)。

一般,我們在Controller中加參數(shù)獲取HttpServletRequest,如下所示:

@RestController
@RequestMapping("/gap")
public class PlantTraceController {
    @PostMapping("/plantTrace")
    public Result2 savePlantTraceInfo(@RequestBody JSONObject jsonObject, HttpServletRequest request) {
        String methodName = request.getHeader("methodName");
        ....
}

該方法實現(xiàn)的原理是,在Controller方法開始處理請求時,Spring會將request對象賦值到方法參數(shù)中。此時request對象是方法參數(shù),相當于局部變量,毫無疑問是線程安全的。

Controller中獲取request對象后,如果要在其他方法中(如service方法、工具類方法等)使用request對象,需要在調用這些方法時將request對象作為參數(shù)傳入。

優(yōu)缺點

這種方法的主要缺點是request對象寫起來冗余太多,主要體現(xiàn)在兩點:

  • 如果多個controller方法中都需要request對象,那么在每個方法中都需要添加一遍request參數(shù)
  • request對象的獲取只能從controller開始,如果使用request對象的地方在函數(shù)調用層級比較深的地方,那么整個調用鏈上的所有方法都需要添加request參數(shù)

實際上,在整個請求處理的過程中,request對象是貫穿始終的;也就是說,除了定時器等特殊情況,request對象相當于線程內部的一個全局變量。而該方法,相當于將這個全局變量,傳來傳去。

方法2、自動注入來獲取request

注意:只能在Bean中注入request

@Controller
public class TestController{
    @Autowired
    private HttpServletRequest request; //自動注入request
    @RequestMapping("/test")
    public void test() throws InterruptedException{
        //模擬程序執(zhí)行了一段時間
        Thread.sleep(1000);
    }
}

優(yōu)缺點

該方法的主要優(yōu)點:

  1. 注入不局限于Controller中:在方法1中,只能在Controller中加入request參數(shù)。而對于方法2,不僅可以在Controller中注入,還可以在任何Bean中注入,包括Service、Repository及普通的Bean。
  2. 注入的對象不限于request:除了注入request對象,該方法還可以注入其他scope為request或session的對象,如response對象、session對象等;并保證線程安全。
  3. 減少代碼冗余:只需要在需要request對象的Bean中注入request對象,便可以在該Bean的各個方法中使用,與方法1相比大大減少了代碼冗余。

但是,該方法也會存在代碼冗余。考慮這樣的場景:web系統(tǒng)中有很多controller,每個controller中都會使用request對象(這種場景實際上非常頻繁),這時就需要寫很多次注入request的代碼;如果還需要注入response,代碼就更繁瑣了。下面說明自動注入方法的改進方法,并分析其線程安全性及優(yōu)缺點。

方法3:基類中自動注入(推薦)

注意:只能在Bean中注入request

與方法2相比,將注入部分代碼放入到了基類中。

基類代碼:

public class BaseController {
    @Autowired
    protected HttpServletRequest request;     
}

優(yōu)缺點

與方法2相比,避免了在不同的Controller中重復注入request;但是考慮到java只允許繼承一個基類,所以如果Controller需要繼承其他類時,該方法便不再好用。

無論是方法2和方法3,都只能在Bean中注入request;如果其他方法(如工具類中static方法)需要使用request對象,則需要在調用這些方法時將request參數(shù)傳遞進去。下面介紹的方法4,則可以直接在諸如工具類中的static方法中使用request對象(當然在各種Bean中也可以使用)。

方法4:從RequestContextHolder中獲取request

代碼示例

@Controller
public class TestController {
    @RequestMapping("/test")
    public void test() throws InterruptedException {
        HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
        // 模擬程序執(zhí)行了一段時間
        Thread.sleep(1000);
    }
}

優(yōu)缺點

優(yōu)點:可以在非Bean中直接獲取。缺點:如果使用的地方較多,代碼非常繁瑣;因此可以與其他方法配合使用。

以上就是在SpringBoot項目中獲取Request的四種方法的詳細內容,更多關于SpringBoot獲取Request的資料請關注腳本之家其它相關文章!

相關文章

  • Spring事件監(jiān)聽基本原理與使用詳解

    Spring事件監(jiān)聽基本原理與使用詳解

    這篇文章主要介紹了Spring事件監(jiān)聽基本原理與使用詳解,Spring的事件監(jiān)聽機制和發(fā)布訂閱機制是很相似的:發(fā)布了一個事件后,監(jiān)聽該類型事件的所有監(jiān)聽器會觸發(fā)相應的處理邏輯,需要的朋友可以參考下
    2024-01-01
  • springboot啟動掃描不到dao層接口的解決方案

    springboot啟動掃描不到dao層接口的解決方案

    這篇文章主要介紹了springboot啟動掃描不到dao層接口的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java開發(fā)MyBatis中常用plus實體類注解符詳解

    java開發(fā)MyBatis中常用plus實體類注解符詳解

    這篇文章主要為大家介紹了java開發(fā)MyBatis常用的plus實體類注解符示例應用詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • idea 查看一個類的所有子類以及子類的子類并以層級關系顯示

    idea 查看一個類的所有子類以及子類的子類并以層級關系顯示

    這篇文章主要介紹了idea 查看一個類的所有子類以及子類的子類并以層級關系顯示,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • Java 對接飛書多維表格使用詳解(微服務)

    Java 對接飛書多維表格使用詳解(微服務)

    本文詳細介紹了如何基于飛書開放平臺在微服務項目中操作飛書多維表格,包括應用創(chuàng)建、授權、多維表數(shù)據(jù)操作(新增、查詢、刪除)以及Java SDK實現(xiàn)等步驟,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Java中串行接口調用優(yōu)化方式

    Java中串行接口調用優(yōu)化方式

    這篇文章主要介紹了Java中串行接口調用優(yōu)化方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • springboot配置templates直接訪問的實現(xiàn)

    springboot配置templates直接訪問的實現(xiàn)

    這篇文章主要介紹了springboot配置templates直接訪問的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • JAVA之讀取properties時路徑的注意問題

    JAVA之讀取properties時路徑的注意問題

    這篇文章主要介紹了JAVA之讀取properties時路徑的注意問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • servlet轉發(fā)、包含詳解(七)

    servlet轉發(fā)、包含詳解(七)

    這篇文章主要為大家詳細介紹了servlet轉發(fā)、包含的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • ScheduledExecutorService任務定時代碼示例

    ScheduledExecutorService任務定時代碼示例

    這篇文章主要介紹了ScheduledExecutorService任務定時代碼示例,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01

最新評論