spring-webflux中如何获取当前请求的上下文

How to get the context of the current request in spring-webflux

在经典的 spring-mvc 中,可以在 RequestContextHolder 上设置请求范围的属性。在此基础上,我们可以在 HandlerInterceptorAdapter 中解析传入请求,设置请求参数,例如当前登录的用户、唯一请求 ID(用于日志关联)等。 这些请求属性可以在请求的生命周期内从任何服务(不仅是控制器)静态检索。

我正在尝试实现与 spring-webflux 类似的东西。

我可以使用 WebFilter 拦截所有传入请求,获取当前 ServerWebExchange 并在其上设置属性。但是,除了控制器方法之外,我看不到任何其他方法可以获取当前请求的 ServerWebExchange

我正在寻找比绕过 ServerWebExchange(或 ServerHttpRequest)更好的解决方案。

这似乎很难在 webflux 中实现,因为我们不能依赖于在 ThreadLocal 上保存与特定请求关联的变量(由于非阻塞架构,单个线程可以在请求中途切换)。
不过,这是一个重要的要求。也许有不同的方法?

您描述的方法是当前受支持的方法。 正如您强调的那样,使用 ThreadLocals 的静态方法是不可能的。

Reactor 正在研究具有新上下文功能的替代方案(参见 this PR)。 Spring 可能会选择并使用它,但不一定用于请求属性,因为当前模型非常适合。

如果您想要一个特定的扩展点来拦截请求,请在 Spring 框架项目上创建一个 JIRA issue,描述您想要实现的目标以及失败的地方。