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,描述您想要实现的目标以及失败的地方。
在经典的 spring-mvc 中,可以在 RequestContextHolder
上设置请求范围的属性。在此基础上,我们可以在 HandlerInterceptorAdapter
中解析传入请求,设置请求参数,例如当前登录的用户、唯一请求 ID(用于日志关联)等。
这些请求属性可以在请求的生命周期内从任何服务(不仅是控制器)静态检索。
我正在尝试实现与 spring-webflux 类似的东西。
我可以使用 WebFilter
拦截所有传入请求,获取当前 ServerWebExchange
并在其上设置属性。但是,除了控制器方法之外,我看不到任何其他方法可以获取当前请求的 ServerWebExchange
。
我正在寻找比绕过 ServerWebExchange
(或 ServerHttpRequest
)更好的解决方案。
这似乎很难在 webflux 中实现,因为我们不能依赖于在 ThreadLocal 上保存与特定请求关联的变量(由于非阻塞架构,单个线程可以在请求中途切换)。
不过,这是一个重要的要求。也许有不同的方法?
您描述的方法是当前受支持的方法。
正如您强调的那样,使用 ThreadLocals
的静态方法是不可能的。
Reactor 正在研究具有新上下文功能的替代方案(参见 this PR)。 Spring 可能会选择并使用它,但不一定用于请求属性,因为当前模型非常适合。
如果您想要一个特定的扩展点来拦截请求,请在 Spring 框架项目上创建一个 JIRA issue,描述您想要实现的目标以及失败的地方。