Spring WebClient过滤器

Spring WebClient Filters

1.概述

在本教程中,我们将探索Spring WebFlux(一种功能性的反应式Web框架)中的WebClient过滤器。

2.请求过滤器

筛选器可以拦截,检查和修改客户端请求(或响应)。过滤器非常适合为每个请求添加功能,因为逻辑停留在一个地方。用例包括监视,修改,记录和验证客户端请求,仅举几例。

请求具有零个或多个过滤器的有序链。

在Spring Reactive中,过滤器是功能接口ExchangeFilterFunction的实例。筛选器函数具有两个参数:要修改的ClientRequest和下一个ExchangeFilterFunction。

通常,过滤器函数通过调用过滤器链中的下一个返回:

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

3. WebClient过滤

实现请求过滤器后,我们必须将其"附加"到WebClient实例。这只能在创建WebClient时完成。

接下来,让我们看看如何创建WebClient。第一种选择是使用或不使用基本URL来调用WebClient.create():

1
WebClient webClient = WebClient.create();

不幸的是,这不允许添加过滤器。那么,第二个选择就是我们正在寻找的那个。

通过使用WebClient.builder(),我们可以添加过滤器:

1
2
3
WebClient webClient = WebClient.builder()
  .filter(filterFunction)
  .build();

4.自定义过滤器

让我们从一个过滤器开始,该过滤器计算客户端发送的HTTP GET请求。

过滤器检查请求方法,并在GET请求的情况下增加"全局"计数器:

1
2
3
4
5
6
7
ExchangeFilterFunction countingFunction = (clientRequest, nextFilter) -> {
    HttpMethod httpMethod = clientRequest.method();
    if (httpMethod == HttpMethod.GET) {
        getCounter.incrementAndGet();
    }
    return nextFilter.exchange(clientRequest);
};

我们将定义的第二个过滤器将版本号附加到请求URL路径。我们利用ClientRequest.from()方法从当前请求对象创建一个新的请求对象,并设置修改后的URL。

随后,我们继续使用新的修改后的请求对象执行过滤器链:

1
2
3
4
5
6
7
8
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。这些详细信息在请求对象中可用。

然后,我们要做的就是打印到一些输出流:

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

5.标准过滤器

最后,让我们研究一下基本身份验证-请求过滤的一种非常常见的用例。

辅助类ExchangeFilterFunctions提供basicAuthentication()过滤器函数,该函数负责将授权标头添加到请求中。

结果,我们不需要为其定义过滤器:

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

六,结论

在这篇简短的文章中,我们探讨了在Spring中过滤WebFlux客户端。

与往常一样,该代码示例可在GitHub上找到。