最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在Spring WebFlux的任何地方獲取Request對(duì)象

 更新時(shí)間:2021年01月26日 10:53:06   作者:南瓜慢說(shuō)  
這篇文章主要介紹了如何在Spring WebFlux的任何地方獲取Request對(duì)象,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下

1 不一樣的世界

在常規(guī)的Spring Web項(xiàng)目中,我們要獲取Request對(duì)象是非常方便的,不少庫(kù)都提供了靜態(tài)方法來(lái)獲取。獲取代碼如下:

ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
// get the request
HttpServletRequest request = requestAttributes.getRequest();

在類RequestContextHolder提供了靜態(tài)方法,也就意味著你可以在任何地方調(diào)用。而它使用了ThreadLocal來(lái)保存Request對(duì)象,也就是不同線程是可以獲取各自的Request對(duì)象。

但在響應(yīng)式WebFlux的世界里,并沒(méi)有提供類似的Holder類,而WebFlux是無(wú)法感知線程的,任何一個(gè)線程可以在任何時(shí)候處理任何請(qǐng)求,如果它覺(jué)得切換當(dāng)前線程更有效率,它就會(huì)這么做。但在Servlet Based的應(yīng)用里,它會(huì)為某個(gè)請(qǐng)求安排一個(gè)線程去處理完整個(gè)過(guò)程。

這個(gè)巨大的差別,意味著不能簡(jiǎn)單地通過(guò)ThreadLocal來(lái)保存和獲取Request了。

2 先保存,再獲取

為了在后面可以方便獲得Request對(duì)象,我們就需要在開(kāi)始的時(shí)候把它存在一個(gè)可以使用、并且是相同scope的容器里。這里需要解決兩個(gè)關(guān)鍵問(wèn)題:

(1)Request對(duì)象從何而來(lái);

(2)存在哪里?

針對(duì)問(wèn)題(1), 我們可以回想什么時(shí)候會(huì)出現(xiàn)Request對(duì)象,最容易想得到的就是WebFilter了,它的方法簽名如下:

public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain);

我們可以通過(guò)ServerWebExchange直接獲取到Request對(duì)象:

ServerHttpRequest request = exchange.getRequest();

而因?yàn)?code>Filter是可以先于應(yīng)用邏輯執(zhí)行的,所以滿足要求,問(wèn)題(1)解決。

針對(duì)問(wèn)題(2),需要一個(gè)與Reavtive請(qǐng)求相同范圍的容器,reactor.util.context.Context可以滿足需求。查看reactor的官方文檔(https://projectreactor.io/docs/core/release/reference/#context )可見(jiàn)下面這段話:

Since version 3.1.0, Reactor comes with an advanced feature that is somewhat comparable to ThreadLocal but can be applied to a Flux or a Mono instead of a Thread. This feature is called Context.

并且官網(wǎng)也給出了為何ThreadLocal在某些場(chǎng)景不適用的解釋,有興趣可以看看。

3 代碼實(shí)現(xiàn)

3.1 WebFilter獲取并保存

首先,在WebFilter中獲取Request對(duì)象并保存,代碼如下:

@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
public class ReactiveRequestContextFilter implements WebFilter {
  @Override
  public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    ServerHttpRequest request = exchange.getRequest();
    return chain.filter(exchange)
        .subscriberContext(ctx -> ctx.put(ReactiveRequestContextHolder.CONTEXT_KEY, request));
  }
}

ServerWebExchange中獲取到ServerHttpRequest對(duì)象,再通過(guò)put方法把它放進(jìn)Context里。

3.2 工具類Holder

實(shí)現(xiàn)一個(gè)工具類來(lái)提供靜態(tài)方法,在Filter后的任何場(chǎng)景都可以使用:

public class ReactiveRequestContextHolder {
  public static final Class<ServerHttpRequest> CONTEXT_KEY = ServerHttpRequest.class;

  public static Mono<ServerHttpRequest> getRequest() {
    return Mono.subscriberContext()
        .map(ctx -> ctx.get(CONTEXT_KEY));
  }
}

3.3 在Controller中使用

我們嘗試在Controller中使用ReactiveRequestContextHolder來(lái)獲取Request

@RestController
public class GetRequestController {

  @RequestMapping("/request")
  public Mono<String> getRequest() {
    return ReactiveRequestContextHolder.getRequest()
        .map(request -> request.getHeaders().getFirst("user"));
  }
}

上面方法獲取了Request對(duì)象,然后再獲取了Request中的Header

啟動(dòng)應(yīng)用,測(cè)試如下:

$ curl http://localhost:8088/request -H 'user: pkslow'
pkslow

$ curl http://localhost:8088/request -H 'user: larry'
larry

$ curl http://localhost:8088/request -H 'user: www.pkslow.com'
www.pkslow.com

可以成功獲取請(qǐng)求頭user

4 總結(jié)

代碼請(qǐng)查看:https://github.com/LarryDpk/pkslow-samples

以上就是如何在Spring WebFlux的任何地方獲取Request對(duì)象的詳細(xì)內(nèi)容,更多關(guān)于Spring WebFlux獲取Request對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue3實(shí)現(xiàn)一個(gè)todo-list

    vue3實(shí)現(xiàn)一個(gè)todo-list

    這篇文章主要為大家詳細(xì)介紹了基于vuejs實(shí)現(xiàn)一個(gè)todolist項(xiàng)目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來(lái)幫助
    2021-08-08
  • Java運(yùn)算符解密之位運(yùn)算、移位運(yùn)算舉例詳解

    Java運(yùn)算符解密之位運(yùn)算、移位運(yùn)算舉例詳解

    這篇文章主要介紹了Java運(yùn)算符解密之位運(yùn)算、移位運(yùn)算的相關(guān)資料,Java中的位運(yùn)算符包括按位與&、按位或|、按位取反~和按位異或^,用于對(duì)數(shù)據(jù)的二進(jìn)制位進(jìn)行操作,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • IDEA類和方法注釋模板設(shè)置(非常詳細(xì))

    IDEA類和方法注釋模板設(shè)置(非常詳細(xì))

    這篇文章主要介紹了IDEA類和方法注釋模板設(shè)置(非常詳細(xì)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Java使用POI-TL和JFreeChart動(dòng)態(tài)生成Word報(bào)告

    Java使用POI-TL和JFreeChart動(dòng)態(tài)生成Word報(bào)告

    本文介紹了使用POI-TL和JFreeChart生成包含動(dòng)態(tài)數(shù)據(jù)和圖表的Word報(bào)告的方法,并分享了實(shí)際開(kāi)發(fā)中的踩坑經(jīng)驗(yàn),通過(guò)代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2025-02-02
  • 如何使用IDEA新建一個(gè)普通的Javaweb項(xiàng)目

    如何使用IDEA新建一個(gè)普通的Javaweb項(xiàng)目

    今天給大家普及如何使用IDEA新建一個(gè)普通的Javaweb項(xiàng)目及配置tomcat的方法,在文末給大家提到如果不想每次都重啟tomcat,可以設(shè)置快捷方式,對(duì)idea新建Javaweb項(xiàng)目感興趣的朋友一起看看吧
    2021-06-06
  • JAVA判斷兩個(gè)時(shí)間之間的差

    JAVA判斷兩個(gè)時(shí)間之間的差

    經(jīng)常會(huì)遇到需要判斷兩個(gè)時(shí)間之間的差異的情況,本文主要介紹了JAVA計(jì)算兩個(gè)時(shí)間之間的差,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • springboot項(xiàng)目獲取resources相對(duì)路徑的方法

    springboot項(xiàng)目獲取resources相對(duì)路徑的方法

    這篇文章主要介紹了springboot項(xiàng)目獲取resources相對(duì)路徑的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 往DAO類中注入@PersistenceContext和@Resource的區(qū)別詳解

    往DAO類中注入@PersistenceContext和@Resource的區(qū)別詳解

    這篇文章主要介紹了往DAO類中注入@PersistenceContext和@Resource的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 關(guān)于SpringBoot改動(dòng)后0.03秒啟動(dòng)的問(wèn)題

    關(guān)于SpringBoot改動(dòng)后0.03秒啟動(dòng)的問(wèn)題

    這篇文章主要介紹了SpringBoot改動(dòng)后0.03秒啟動(dòng),本文結(jié)合示例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • 關(guān)于feign.codec.DecodeException異常的解決方案

    關(guān)于feign.codec.DecodeException異常的解決方案

    這篇文章主要介紹了關(guān)于feign.codec.DecodeException異常的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論

桂平市| 乐昌市| 万荣县| 达拉特旗| 东阿县| 界首市| 扎囊县| 屯留县| 鹤山市| 青州市| 汕尾市| 龙州县| 民和| 孟连| 新平| 海口市| 宿松县| 玉山县| 宜阳县| 尼玛县| 南昌市| 沙田区| 利辛县| 武胜县| 大庆市| 玉溪市| 鄂州市| 奎屯市| 南江县| 裕民县| 天镇县| 丘北县| 二手房| 息烽县| 延长县| 蓝田县| 蓝山县| 留坝县| 遵化市| 白城市| 丁青县|