簡體   English   中英

如何有條件地從 WebFilter 中的 Mono 返回?

[英]How do I conditionally return from a Mono within a WebFilter?

不確定我問的對不對,所以這是我想做的一個例子(以阻塞的命令式風格)

public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
  Mono<MyThing> myThingMono = getMyThingMono();
  // I Know this is not right but it's effectively what I want to do
  if( myThingMono is empty ) {
    return chain.filter(exchange);
  } else {
    MyThing thing = myThingMono.block(); // I know I can't do this
    switch(thing.status) {
      case A:
        exchange.getResponse().setStatus(HttpStatus.BAD_REQUEST);
        return exchange.getResponse().setComplete();
      default: 
        return chain.filter(exchange);
    }
  }
}

這是我以被動方式獲得的最接近的

public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
  Mono<MyThing> myThingMono = getMyThingMono();
  myThingMono.map(thing -> {
    switch(thing.status) {
      case A: return HttpStatus.BAD_REQUEST;
      default: return HttpStatus.OK;
    }        
  })
  .defaultIfEmpty(HttpStatus.OK) // in case myThingMono is empty
  .map(status -> {
    switch(status) {
      case HttpStatus.OK:
        return chain.filter(exchange);
      default:
        exchange.getResponse().setStatusCode(status);
        return exchange.getResponse().setComplete();
    }        
  })
  .then();

myThingMono 想要返回 aa Mono<Object>但我的過濾器期待Mono<Void>所以我只是將.then()塞入其中。 我確定這是不對的。

我的代碼編譯並到達最終的 switch 語句並調用正確的 return 語句,但請求沒有到達我的 controller 網絡過濾器未正確轉發請求。 我只是在沒有處理程序結果的情況下返回 200 狀態。

什么是正確的反應方式來做到這一點?

我的意思是這樣的。 如果您的代碼在第一次轉換中沒有輸入,我使用.switchIfEmpty(Mono.empty())返回一些東西。 您還可以創建一個默認Mono.just(new MyThing())

然后我使用flatMap將所有邏輯switch...放在里面。

enum MyThingEnum { A }

class MyThing { public MyThingEnum status; }

public class Test {
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        Mono<MyThing> myThingMono = getMyThingMono();
        return myThingMono.flatMap(thing -> {
            switch (thing.status) {
                case A:
                    exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
                    return exchange.getResponse().setComplete();
                default:
                    exchange.getResponse().setStatusCode(HttpStatus.OK);
                    return chain.filter(exchange);
            }
        })
        .switchIfEmpty(Mono.empty());
    }

    private Mono<MyThing> getMyThingMono() {
        return Mono.just(new MyThing());
    }
}

從另一個 Mono 內部返回時如何避免中斷 WebFilter 中的請求流<object> &gt;?<div id="text_translate"><p> 例如,這是一些荒謬的代碼</p><pre>@Component public final class ReCaptchaCheckWebFilter implements WebFilter { @Override public Mono&lt;Void&gt; filter(ServerWebExchange exchange, WebFilterChain chain) { return Mono.just("foo").map(s -&gt; chain.filter(exchange)).then(); } }</pre><p> 使用這個 webfiler,請求永遠不會到達我的 Controller。 它確實返回 200 http 狀態代碼。</p><p> 如果我發現自己需要從另一個 Mono&lt;Object&gt; 內部返回,在將請求沿過濾器鏈轉發到 controller 時,我該怎么做?</p></div></object>

[英]How can avoid breaking request flow in WebFilter when returning from inside another Mono<Object>>?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM