如何在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 的一些想法

如何在 spring-webflux RouterFunction 端点中使用 OpenApi 注释?

如何在没有 spring-boot 的情况下在 spring-webflux 中加载配置?

如何在pywebio中获取当前请求的url

.net中如何获取被请求页面的 url