如何在Spring WebClient 中添加 Filters
1. 概述
在本文中,我们将讨论Spring WebFlux中的WebClient过滤器,WebFlux是一个功能强大、反应性强的web框架
2. Request Filters
Request Filters过滤器可以拦截、检查和修改客户机请求(或响应)。过滤器非常适合为每个单独的请求添加功能。使用场景包括监视、修改、记录和验证客户机请求
一个请求包含由零个或多个过滤器组成的有序链
在Spring Reactive中,过滤器是ExchangeFilterFunction功能接口的实例。过滤器函数有两个参数:要修改的ClientRequest和下一个ExchangeFilterFunction。
通常,一个过滤器函数通过调用过滤器链中的下一个返回:
ExchangeFilterFunction filterFunction = (clientRequest, nextFilter) -> {
LOG.info("WebClient fitler executed");
return nextFilter.exchange(clientRequest);
};
3. WebClient Filtering
在实现请求过滤器之后,我们必须将其添加到WebClient实例中,这只能在创建WebClient时完成。
那么,让我们看看如何创建一个WebClient。常用的方法是调用WebClient.create(),不管有没有Base URL:
WebClient webClient = WebClient.create();
但是这种方法是不允许添加过滤器的,我们应该使用 WebClient.builder() 方法
WebClient webClient = WebClient.builder()
.filter(filterFunction)
.build();
4. 自定义Filter
让我们编写一个对客户机发送的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. 标准的Filter
最后,让我们看看基本身份验证——请求过滤的一个非常常见的例子。
ExchangeFilterFunctions提供了basicAuthentication()过滤器函数,该函数负责向请求添加授权头。
WebClient webClient = WebClient.builder()
.filter(ExchangeFilterFunctions.basicAuthentication(user, password))
.build();
6. 结论
在本文中,我们介绍了WebClient中如何增加Filter和几个简单的Filter编写列子