知識庫 / HTTP Client-Side RSS 訂閱

Spring WebClient 過濾器

HTTP Client-Side,Spring Web
HongKong
6
01:19 PM · Dec 06 ,2025

1. 概述

在本教程中,我們將探索 <em >WebClient</em> 過濾器在 <em >Spring WebFlux</em> 中的應用,<em >Spring WebFlux</em> 是一種功能型、響應式的 Web 框架。

2. 請求過濾器

過濾器可以攔截、檢查和修改客户端請求(或響應)。 過濾器非常適合為每個請求添加功能,因為邏輯位於一個地方。 使用案例包括監控、修改、記錄和驗證客户端請求,僅舉幾個例子。

請求具有零個或多個過濾器的有序鏈。

在 Spring Reactive 中,過濾器是 ExchangeFilterFunction 功能接口的實例。 過濾器函數有兩個參數:要修改的 ClientRequest 和下一個 ExchangeFilterFunction

通常,過濾器函數通過調用鏈中的下一個過濾器來返回:

ExchangeFilterFunction filterFunction = (clientRequest, nextFilter) -> {
    LOG.info("WebClient fitler executed");
    return nextFilter.exchange(clientRequest);
};

3. WebClient 過濾

在實施請求過濾器後,我們需要將其“附加”到 WebClient 實例上。這隻能在創建 WebClient 時完成。

因此,讓我們看看如何創建 WebClient。第一個選項是在調用 WebClient.create() 方法時,可以或不帶基礎 URL:

WebClient webClient = WebClient.create();

不幸的是,這並不允許添加過濾器。因此,我們尋找的解決方案是第二種。

通過使用 WebClient.builder(),我們可以添加過濾器:

WebClient webClient = WebClient.builder()
  .filter(filterFunction)
  .build();

4. 自定義過濾器

我們首先創建一個過濾器,用於統計客户端發出的 HTTP GET 請求數量。

該過濾器檢查請求方法,並在收到 GET 請求時,增加一個“全局”計數器。

ExchangeFilterFunction countingFunction = (clientRequest, nextFilter) -> {
    HttpMethod httpMethod = clientRequest.method();
    if (httpMethod == HttpMethod.GET) {
        getCounter.incrementAndGet();
    }
    return nextFilter.exchange(clientRequest);
};

我們接下來定義第二個過濾器,它會將版本號追加到請求 URL 路徑中。我們使用 ClientRequest.from()方法從當前請求對象創建新的請求對象,並設置修改後的 URL。

隨後,我們繼續執行過濾器鏈,使用修改後的請求對象。

ExchangeFilterFunction urlModifyingFilter = (clientRequest, nextFilter) -> {
    String oldUrl = clientRequest.url().toString();
    URI newUrl = URI.create(oldUrl + "/" + version);
    ClientRequest filteredRequest = ClientRequest.from(clientRequest)
      .url(newUrl)
      .build();
    return nextFilter.exchange(filteredRequest);
};

接下來,我們定義一個過濾器,用於記錄發送請求的方法以及它們的 URL。這些信息都可以在請求對象中找到。

我們只需要將輸出打印到某個輸出流:

ExchangeFilterFunction loggingFilter = (clientRequest, nextFilter) -> {
    printStream.print("Sending request " + clientRequest.method() + " " + clientRequest.url());
    return nextFilter.exchange(clientRequest);
};

5. 標準過濾器

最後,讓我們深入瞭解基本的身份驗證——這是一種非常常見的請求過濾用例。

助手類 ExchangeFilterFunctions 提供了 basicAuthentication() 過濾器函數,該函數負責將 授權 標頭添加到請求中。

因此,我們不需要為它定義一個過濾器:

WebClient webClient = WebClient.builder()
  .filter(ExchangeFilterFunctions.basicAuthentication(user, password))
  .build();

6. 結論

在本文中,我們探討了在 Spring 中過濾 WebFlux 客户端的方法。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.