日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

如何在Spring WebFlux的任何地方獲取Request對象

瀏覽:183日期:2023-07-25 11:51:14
1 不一樣的世界

在常規的Spring Web項目中,我們要獲取Request對象是非常方便的,不少庫都提供了靜態方法來獲取。獲取代碼如下:

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

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

但在響應式WebFlux的世界里,并沒有提供類似的Holder類,而WebFlux是無法感知線程的,任何一個線程可以在任何時候處理任何請求,如果它覺得切換當前線程更有效率,它就會這么做。但在Servlet Based的應用里,它會為某個請求安排一個線程去處理完整個過程。

這個巨大的差別,意味著不能簡單地通過ThreadLocal來保存和獲取Request了。

2 先保存,再獲取

為了在后面可以方便獲得Request對象,我們就需要在開始的時候把它存在一個可以使用、并且是相同scope的容器里。這里需要解決兩個關鍵問題:

(1)Request對象從何而來;

(2)存在哪里?

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

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

我們可以通過ServerWebExchange直接獲取到Request對象:

ServerHttpRequest request = exchange.getRequest();

而因為Filter是可以先于應用邏輯執行的,所以滿足要求,問題(1)解決。

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

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.

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

3 代碼實現3.1 WebFilter獲取并保存

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

@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對象,再通過put方法把它放進Context里。

3.2 工具類Holder

實現一個工具類來提供靜態方法,在Filter后的任何場景都可以使用:

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來獲取Request:

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

上面方法獲取了Request對象,然后再獲取了Request中的Header。

啟動應用,測試如下:

$ 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

可以成功獲取請求頭user。

4 總結

代碼請查看:https://github.com/LarryDpk/pkslow-samples

以上就是如何在Spring WebFlux的任何地方獲取Request對象的詳細內容,更多關于Spring WebFlux獲取Request對象的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品美女久久| 日韩高清不卡一区| 国产一区二区久久久久| 久久精品国产99国产精品| 蜜桃视频免费观看一区| 99热精品久久| 五月天久久网站| 电影天堂国产精品| 日韩欧美一区二区三区免费看| 神马午夜在线视频| 国产欧美日韩| 国产精品日本一区二区不卡视频| 久久国产精品亚洲77777| 午夜久久免费观看| 久久美女性网| 最新日韩欧美| 久久伊人国产| 欧美成人国产| 日韩av中文在线观看| 国产视频一区在线观看一区免费| 深夜福利一区| 久久精品国产68国产精品亚洲| 国产色噜噜噜91在线精品| 激情六月综合| 日本不良网站在线观看| 日本不卡视频在线观看| 亚洲午夜黄色| а√天堂8资源在线| 国产欧美一区二区三区米奇| 久久成人精品| 欧美特黄一级| 久久国际精品| 日韩国产一区二区| 亚洲一区二区免费看| 国产精品羞羞答答在线观看| 性色一区二区| 美女国产一区二区三区| 国产成人精选| 性欧美69xoxoxoxo| 午夜天堂精品久久久久| 国产精品777777在线播放| 国产在线视频欧美一区| 久久国产毛片| 亚洲久久在线| 国产成人精品一区二区三区视频| 亚洲精品97| 国产欧美丝祙| 色一区二区三区四区| 亚洲综合精品| 精品国产亚洲日本| 亚洲欧美一区在线| 国产精品最新| 亚洲在线观看| 国产精品久久久久久久久妇女| 欧美网站在线| 成人日韩av| 中文字幕中文字幕精品| 中文字幕在线视频久| 亚洲a级精品| 久久久久蜜桃| 久久精品凹凸全集| 国产在线观看www| 亚洲免费激情| 欧美激情视频一区二区三区在线播放| 日韩av在线中文字幕| 97在线精品| 日韩中文av| 久久久久久夜| 久久亚洲美女| 欧美精品第一区| 91九色精品| 91精品福利观看| 日韩三区在线| 亚洲精品欧美| а√天堂8资源中文在线| 亚洲ww精品| 中文字幕人成乱码在线观看| 免费久久久久久久久| 日韩av中文在线观看| 日韩大片免费观看| 日韩一区精品字幕| 国产欧美在线| 蜜桃tv一区二区三区| 91欧美极品| 久久亚洲成人| 久久成人高清| 石原莉奈一区二区三区在线观看| 欧美一级二级三级视频| 中文字幕在线视频网站| 亚洲香蕉久久| 国产精品麻豆久久| 日韩中文字幕| 国产高潮在线| 香蕉久久一区| 伊人久久大香线蕉av不卡| 国产欧美91| av成人国产| 给我免费播放日韩视频| 涩涩涩久久久成人精品| 亚洲成人不卡| 久久99精品久久久野外观看| 麻豆亚洲精品| 久久久久国产一区二区| 久久狠狠久久| 99成人在线| 国产在线观看www| 国产精品亚洲人成在99www| 亚洲欧美日韩国产一区| 久久精品亚洲一区二区| 日本在线观看不卡视频| 日韩一区免费| 国产精品美女久久久| 欧美日韩精品一本二本三本| 国产 日韩 欧美 综合 一区| 精品一区视频| 国产欧美自拍| 日韩在线网址| 免费一级片91| 91精品电影| av在线日韩| 麻豆91在线播放| 日韩av字幕| 亚洲一区二区免费在线观看| 精品无人区麻豆乱码久久久| 国产日韩一区二区三区在线 | 1024精品久久久久久久久| 日韩电影免费网址| 麻豆精品新av中文字幕| 国产三级精品三级在线观看国产| 亚洲永久精品唐人导航网址| 黄色成人在线网址| 99久久www免费| 国产一区二区三区亚洲| 国产精品99精品一区二区三区∴| 亚洲影院天堂中文av色| 国产精品呻吟| 99pao成人国产永久免费视频| 激情偷拍久久| 色黄视频在线观看| 日韩av免费大片| 国产一区精品福利| 久久中文精品| 欧美国产小视频| 日韩不卡一区| 岛国av免费在线观看| 福利在线免费视频| 麻豆精品视频在线| 日韩中文影院| 亚洲91精品| 国产精品字幕| 久久中文字幕二区| 亚洲五月婷婷| 午夜免费一区| 在线一区视频| 亚洲欧美日韩精品一区二区| 国内精品99| 日韩欧美高清一区二区三区| 日精品一区二区三区| 视频精品一区| 日韩1区2区3区| 日韩一区二区三区精品| 欧美一区自拍| 久久99免费视频| 久久精品网址| 粉嫩av一区二区三区四区五区| 91精品久久久久久久久久不卡| 国产在线欧美| 国产精品腿扒开做爽爽爽挤奶网站| 欧美一区二区三区高清视频 | 国产精品3区| 国产精品久久乐| 精品高清久久| 日韩欧美一区二区三区在线观看 | 欧美日韩亚洲一区三区| 美女久久99| 亚洲成人二区| 亚洲欧美日本国产专区一区| 亚洲人成网77777色在线播放 | 久久精品凹凸全集| 成人在线黄色| 午夜精品免费| 亚洲精品国产精品粉嫩| 欧美激情aⅴ一区二区三区| 日韩精品永久网址| 九色精品91| 亚洲深深色噜噜狠狠爱网站 | 国产精品午夜av| 福利在线免费视频| 91九色精品| 日韩高清不卡一区二区| 久久成人福利| 在线日韩视频| 日韩av中文字幕一区二区| 精品三级av| 夜夜嗨网站十八久久 | 日韩成人精品一区| 免费人成黄页网站在线一区二区| 91精品美女| 神马久久午夜| 视频一区视频二区中文|