Spring Web Flux 过滤器、控制器之间传值
小于 1 分钟
Spring Web Flux 过滤器、控制器之间传值
在 Spring Web MVC 项目中通常我们可以直接使用 ThreadLocal 对值进行保存,同一次请求内多次获取都能拿到值。 但是在 Web Flux 中一个请求可能经过不同线程,所以无法使用这种方法。可以使用 Mono 对象的 context 功能来替代。
Spring Boot 版本
2.6.3
值的保存
使用 Mono 的 contextWrite 方法保存值。
public final Mono<T> contextWrite(Function<Context, Context> contextModifier) {
return onAssembly(new MonoContextWrite(this, contextModifier));
}
例: Filter 1 设置值
public class Filter1 implements GlobalFilter, Ordered{
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange)
.contextWrite(ctx->ctx.put("myCustomContext", "hello"));
}
@Override
public int getOrder() {
return -10;
}
}
值的获取/使用
通过 Mono 的 deferContextual 方法获取 context 对象获取值。
public static <T> Mono<T> deferContextual(Function<ContextView, ? extends Mono<? extends T>> contextualMonoFactory) {
return onAssembly(new MonoDeferContextual(contextualMonoFactory));
}
例: Filter 2 获取值
public class Filter2 implements GlobalFilter, Ordered{
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return Mono.deferContextual(ctx->Mono.just(ctx.get("myCustomContext")))
.flatMap(e->{
System.out.println(e);
return chain.filter(exchange);
});
}
@Override
public int getOrder() {
return -5;
}
}