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

在SpringBoot項(xiàng)目中獲取Request的四種方法

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

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):

  1. 注入不局限于Controller中:在方法1中,只能在Controller中加入request參數(shù)。而對(duì)于方法2,不僅可以在Controller中注入,還可以在任何Bean中注入,包括Service、Repository及普通的Bean。
  2. 注入的對(duì)象不限于request:除了注入request對(duì)象,該方法還可以注入其他scope為request或session的對(duì)象,如response對(duì)象、session對(duì)象等;并保證線程安全。
  3. 減少代碼冗余:只需要在需要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)文章

最新評(píng)論