|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
过滤器
您可以注册一个客户端过滤器 (ExchangeFilterFunction) 通过 WebClient.Builder
以便拦截和修改请求,如下例所示:
-
Java
-
Kotlin
WebClient client = WebClient.builder()
.filter((request, next) -> {
ClientRequest filtered = ClientRequest.from(request)
.header("foo", "bar")
.build();
return next.exchange(filtered);
})
.build();
val client = WebClient.builder()
.filter { request, next ->
val filtered = ClientRequest.from(request)
.header("foo", "bar")
.build()
next.exchange(filtered)
}
.build()
这可以用于横切关注点,例如认证。以下示例使用了一个过滤器通过静态工厂方法进行基本认证:
-
Java
-
Kotlin
import static org.springframework.web.reactive.function.client.ExchangeFilterFunctions.basicAuthentication;
WebClient client = WebClient.builder()
.filter(basicAuthentication("user", "password"))
.build();
import org.springframework.web.reactive.function.client.ExchangeFilterFunctions.basicAuthentication
val client = WebClient.builder()
.filter(basicAuthentication("user", "password"))
.build()
可以通过修改现有的 WebClient 实例来添加或删除过滤器,从而生成一个不会影响原始实例的新 WebClient 实例。例如:
-
Java
-
Kotlin
import static org.springframework.web.reactive.function.client.ExchangeFilterFunctions.basicAuthentication;
WebClient client = webClient.mutate()
.filters(filterList -> {
filterList.add(0, basicAuthentication("user", "password"));
})
.build();
val client = webClient.mutate()
.filters { it.add(0, basicAuthentication("user", "password")) }
.build()
WebClient 是围绕由 ExchangeFunction 跟随的过滤器链的轻量级外观。它提供了一个工作流来处理请求,将请求编码为高级对象以及从高级对象解码,并有助于确保响应内容始终被消耗。当过滤器以某种方式处理响应时,必须特别注意始终消耗其内容,或者以其他方式将其传播到下游的 WebClient,这将确保相同的操作。下面是一个处理 UNAUTHORIZED 状态码的过滤器,但会确保释放任何响应内容,无论是否预期:
-
Java
-
Kotlin
public ExchangeFilterFunction renewTokenFilter() {
return (request, next) -> next.exchange(request).flatMap(response -> {
if (response.statusCode().value() == HttpStatus.UNAUTHORIZED.value()) {
return response.releaseBody()
.then(renewToken())
.flatMap(token -> {
ClientRequest newRequest = ClientRequest.from(request).build();
return next.exchange(newRequest);
});
} else {
return Mono.just(response);
}
});
}
fun renewTokenFilter(): ExchangeFilterFunction? {
return ExchangeFilterFunction { request: ClientRequest?, next: ExchangeFunction ->
next.exchange(request!!).flatMap { response: ClientResponse ->
if (response.statusCode().value() == HttpStatus.UNAUTHORIZED.value()) {
return@flatMap response.releaseBody()
.then(renewToken())
.flatMap { token: String? ->
val newRequest = ClientRequest.from(request).build()
next.exchange(newRequest)
}
} else {
return@flatMap Mono.just(response)
}
}
}
}