22

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

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

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

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

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

4

1 回答 1

6

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

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

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

于 2017-05-16T08:48:27.070 回答