在经典的spring-mvc中,可以在RequestContextHolder
上设置请求范围属性。在此基础上,我们可以在HandlerInterceptorAdapter
中解析传入的请求,设置请求参数,例如当前登录的用户,唯一的请求ID(用于日志关联)等等。
在请求的生命周期内,可以从任何服务(不仅仅是控制器)静态检索这些请求属性。
我正在尝试使用spring-webflux实现类似的功能。
我可以使用WebFilter
拦截所有传入的请求,获取当前ServerWebExchange
并在其上设置属性。但是我没有看到任何方法将当前请求的ServerWebExchange
除了控制器方法以外的任何其他地方。
我正在寻找比传递ServerWebExchange
(或ServerHttpRequest
)更好的解决方案。
似乎这很难在webflux中实现,因为我们不能依赖于在ThreadLocal上保存与特定请求相关联的变量(因为非阻塞架构,单个线程可以在飞行途中的请求之间切换)。 /> 不过,这是一个重要的要求。也许有不同的方法?
答案 0 :(得分:5)
您描述的方法是目前支持的方法。
正如您所强调的那样,使用ThreadLocals
的静态方法是不可能的。
Reactor正在研究具有新上下文功能的替代方案(参见this PR)。 Spring可能会选择并使用它,但不一定是请求属性,因为当前模型非常适合。
如果您想要一个特定的扩展点来拦截请求,请在Spring Framework项目上创建一个JIRA issue,描述您尝试实现的目标和失败的地方。