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

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

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

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

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

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

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

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

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

2 先保存,再獲取

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

(1)Request對象從何而來;

(2)存在哪里?

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

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

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

ServerHttpRequest request = exchange.getRequest();

而因為Filter是可以先于應用邏輯執(zhí)行的,所以滿足要求,問題(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.

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

3 代碼實現(xiàn)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

實現(xiàn)一個工具類來提供靜態(tài)方法,在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對象的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩一区二区三区免费视频| 欧美激情久久久久久久久久久| 国产精品黄色| 亚洲午夜一级| 久久国产电影| 爽好久久久欧美精品| 欧美特黄视频| 国产综合亚洲精品一区二| 丰满少妇一区| 亚洲免费资源| 欧美性www| 精品国产一区二区三区av片| 精品中文一区| 国产精品a级| 久久激情中文| 欧美日韩视频免费看| 免费视频一区二区三区在线观看 | 久久国际精品| 日韩av一级| 国产精品毛片在线| 欧美激情精品| 亚洲精品国产精品粉嫩| 美女精品久久| 欧美福利在线| 亚洲制服一区| 91看片一区| 国产精品自拍区| 今天的高清视频免费播放成人| 国产日韩免费| 999在线观看精品免费不卡网站| 亚洲在线观看| 久久久久久夜| 涩涩涩久久久成人精品| 中文字幕人成乱码在线观看 | 快she精品国产999| 亚洲三级精品| 色88888久久久久久影院| 国产欧美啪啪| 亚洲伊人精品酒店| 99精品在线免费在线观看| 国产精品黄色片| 日韩国产高清在线| 成午夜精品一区二区三区软件| 久久高清免费观看| 日本精品在线中文字幕| 精品久久美女| 国产私拍福利精品视频二区| 高清精品久久| 午夜精品成人av| 成人在线视频免费看| 蜜桃传媒麻豆第一区在线观看| 肉色欧美久久久久久久免费看| 国产乱码精品一区二区三区四区 | 亚洲少妇在线| 精品久久在线| 久久激情五月婷婷| 欧美aⅴ一区二区三区视频| 日韩精品视频一区二区三区| 国产视频欧美| 亚洲精品中文字幕乱码| 日韩国产一区| 国产精品成人a在线观看| 欧美专区18| 国产精品毛片久久久| 日韩精品免费视频人成| 三级在线观看一区二区 | 久久99精品久久久野外观看| 综合国产精品| 欧美综合另类| 国产精品v日韩精品v欧美精品网站| 日韩精品免费观看视频| 少妇精品久久久一区二区| 狠狠爱www人成狠狠爱综合网| 亚洲精品一级二级| 国产欧洲在线| av综合电影网站| 日韩精品久久久久久久软件91| 在线观看精品| 日韩欧美看国产| 色天使综合视频| 亚洲成人不卡| 国产亚洲一区二区手机在线观看 | 天堂资源在线亚洲| 久久久久.com| 成人精品亚洲| 亚洲高清激情| 久久亚洲国产精品尤物| 精品三级久久久| 国产在线观看www| 国产一区二区三区91| 精品资源在线| 国产综合精品一区| 蜜臀久久99精品久久久久宅男| 免费在线成人网| 日韩视频一二区| 国产精品一页| 精品一区二区三区亚洲| 日韩激情一二三区| 亚洲不卡av不卡一区二区| 日韩精品久久久久久久电影99爱 | 激情欧美丁香| 日韩一区二区三区在线免费观看| 麻豆91在线播放| 综合日韩av| 亚洲午夜av| 亚洲欧美日韩精品一区二区| 老牛影视一区二区三区| 欧美日韩午夜电影网| 日韩av一区二区三区| 免费日韩av| 午夜亚洲精品| 欧美日一区二区三区在线观看国产免 | 99国产精品久久久久久久| 先锋亚洲精品| 日韩欧美另类中文字幕| 欧美亚洲tv| 欧美一区成人| 美女毛片一区二区三区四区最新中文字幕亚洲 | 精品一区毛片| 日韩一区精品| www.九色在线| 亚洲综合日本| 国产伦理久久久久久妇女| 欧美三级第一页| 欧美日韩1区| 免费一级欧美片在线观看网站 | 国产精品麻豆成人av电影艾秋 | 日韩欧美久久| 91亚洲一区| 亚洲一区观看| 国产欧美69| 亚洲另类视频| 日本久久黄色| 在线观看亚洲精品福利片| 美腿丝袜亚洲三区| 亚洲主播在线| 国产精品一站二站| 一区二区三区四区在线观看国产日韩| 日韩国产在线一| 久久久久久久久99精品大| 日本国产欧美| 国产成人在线中文字幕| 精品国产成人| 亚洲精品一二| 国产高潮在线| 免费人成黄页网站在线一区二区| 欧美日韩一区自拍| 日日摸夜夜添夜夜添国产精品| 福利视频一区| 国产精品日韩欧美一区| 91日韩在线| 日韩av成人高清| 九一精品国产| 国产精品日韩| 亚洲女同av| 欧美日韩一区二区三区四区在线观看 | 久久中文视频| 99久精品视频在线观看视频| 天堂成人免费av电影一区 | 丰满少妇一区| 97精品国产99久久久久久免费| 欧美黄色精品| 伊人www22综合色| 99久久亚洲精品| 久久男人av| 日本欧美在线| 国产66精品| 久久成人av| 视频一区日韩精品| 日韩一区自拍| 国产精品视频一区二区三区四蜜臂 | 国产探花在线精品| aa亚洲婷婷| 日韩免费小视频| 国产精品视频一区二区三区综合| 日韩在线观看一区二区| 在线精品亚洲| 欧美在线资源| 成人午夜国产| 亚洲美女久久精品| 免费亚洲一区| 日本va欧美va欧美va精品| 国产精品66| 麻豆视频在线观看免费网站黄 | 日韩美女一区二区三区在线观看| 亚洲成人精选| 国产欧美大片| 日韩不卡一二三区| 在线视频精品| 日韩一区二区在线免费| 日韩一区二区三区高清在线观看| 91久久午夜| 999国产精品永久免费视频app| 精品一区电影| 欧美黄页在线免费观看| 国产劲爆久久| 欧美亚洲激情| 97国产精品| 99视频精品全国免费| 国产精品777777在线播放|