gpt4 book ai didi

spring - 通过 Spring Webflux 中的请求生命周期共享数据

转载 作者:行者123 更新时间:2023-12-03 16:59:26 25 4
gpt4 key购买 nike

在 Spring MVC 中我可以使用 ThreadLocal 通过一个请求在不同的组件之间共享数据,当请求完成时数据会被自动清除。使用 WebFlux,由于一个请求可以由多个线程处理,因此该解决方案将不起作用。如何实现类似的解决方案,以便最初 WebFilter 可以在请求上下文中设置一些数据,然后可以在 Controller 中访问和修改数据,以及请求经过的任何事件处理程序?
我尝试了subscriberContext,但没有用。这是我的代码。为什么这不起作用?还有其他方法可以共享数据吗?

public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
exchange.getResponse().beforeCommit(() -> {
return Mono.subscriberContext()
.map(context -> {
context.hasKey("test"); // this returns false
})
}

return Mono.subscriberContext()
.map(context -> {context.put("test", "test");})
.flatMap(chain.filter(exchange))
}

最佳答案

如果我没记错的话,是因为.beforeCommit() .此 Mono 和过滤器 Mono 不共享相同的 Subscriber .
要将值添加到请求的subscriberContext。尝试这个:

chain.filter(exchange)
.subscriberContext(context -> context.put("KEY", "VALUE"));
您还可以在 ServerWebExchange 中共享值属性。不过,这是 Spring Web Flux 而不是 Reactor。例如:
exchange.getAttributes().put("KEY", "VALUE");
现在,您可以在应用程序中的任何位置访问 ServerWebExchange您可以使用访问该属性
exchange.getAttributes().get("KEY");

关于spring - 通过 Spring Webflux 中的请求生命周期共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63045428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com