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 客户端的方法。