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

Dor*_*old 18 spring-webflux

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

我试图通过spring-webflux实现类似的功能.

我可以使用a WebFilter拦截所有传入的请求,获取当前ServerWebExchange和设置属性.但是我没有看到任何方法来获取ServerWebExchange除控制器方法之外的其他任何地方的当前请求.

我正在寻找比传递ServerWebExchange(或ServerHttpRequest)所有更好的解决方案.

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

Bri*_*zel 6

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

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

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