如何在spring-webflux中获取当前请求的上下文
Posted
技术标签:
【中文标题】如何在spring-webflux中获取当前请求的上下文【英文标题】:How to get the context of the current request in spring-webflux 【发布时间】:2017-10-14 00:26:29 【问题描述】:在经典的 spring-mvc 中,可以在 RequestContextHolder
上设置请求范围属性。在此基础上,我们可以解析 HandlerInterceptorAdapter
中的传入请求,设置请求参数,例如当前登录用户、唯一请求 ID(用于日志关联)等。
这些请求属性可以在请求的生命周期内从任何服务(不仅是控制器)静态检索。
我正在尝试使用 spring-webflux 实现类似的功能。
我可以使用WebFilter
来拦截所有传入的请求,获取当前的ServerWebExchange
并为其设置属性。但是,除了控制器方法之外,我看不到任何其他方法可以获取当前请求的 ServerWebExchange
。
我正在寻找比到处传递ServerWebExchange
(或ServerHttpRequest
)更好的解决方案。
这似乎在 webflux 中很难实现,因为我们不能依赖在 ThreadLocal 上保存与特定请求相关的变量(由于非阻塞架构,单个线程可以在请求之间切换)。 尽管如此,这是一个重要的要求。也许有不同的方法?
【问题讨论】:
已经快3年了。有这方面的更新吗? @AndrewTFinnell 看到我当时打开的这个问题:github.com/spring-projects/spring-framework/issues/20239。我已停止关注此问题,因为我的团队已从 Spring-webflux 移回 Spring-MVC,但看起来已经取得了一些进展。 @DoronGold 你为什么搬回 MVC? 【参考方案1】:您描述的方法是当前支持的方法。
正如您所强调的,使用 ThreadLocals
的静态方法是不可能的。
Reactor 正在寻找具有新上下文功能的替代方案(请参阅this PR)。 Spring 可能会选择并使用它,但不一定用于请求属性,因为当前模型非常适合。
如果您想要一个特定的扩展点来拦截请求,请在 Spring Framework 项目上创建一个JIRA issue,描述您想要实现的目标以及失败的地方。
【讨论】:
您可能想在 HATEOAS 库中寻找灵感 - github.com/spring-projects/spring-hateoas/blob/master/src/main/… 和 github.com/spring-projects/spring-hateoas/blob/master/src/main/…以上是关于如何在spring-webflux中获取当前请求的上下文的主要内容,如果未能解决你的问题,请参考以下文章
如何记录 spring-webflux WebClient 请求 + 响应详细信息(正文、标头、elasped_time)?
如何在 spring-webflux RouterFunction 端点中使用 OpenApi 注释?