Spring WebClient过滤器

2023/05/13

1. 概述

在本教程中,我们将探索Spring WebFlux中的WebClient过滤器,这是一个函数式的响应式Web框架。

2. 请求过滤器

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

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

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

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

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

3. WebClient过滤器

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

那么,让我们看看如何创建WebClient。第一个选项是使用或不使用基本URL调用WebClient.create():

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()过滤器函数,它负责将authorization标头添加到请求中。

因此,我们不需要为它定义过滤器:

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

6. 总结

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

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章