如何在spring-webflux

时间:2017-05-15 09:24:55

标签: spring-webflux

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

我正在尝试使用spring-webflux实现类似的功能。

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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