当前位置: 首页 > 知识库问答 >
问题:

如何在spring-webflux中获取当前请求的上下文

鞠边浩
2023-03-14

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

我正在尝试用Spring-WebFlux实现类似的功能。

我可以使用webfilter拦截所有传入请求,获取当前的serverwebexchange并对其设置属性。但是,除了controller方法之外,我看不到任何其他地方可以获得当前请求的ServerWebExchange

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

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

共有1个答案

赖明煦
2023-03-14

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

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

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

 类似资料:
  • 检查userDbRecord Mono是否为空以及如果不为空则从中提取phone属性的最佳方法是什么?

  • 我正在使用SpringWebFlux创建RouterFunction和Handler。我的处理函数有@Aspect,如下所示,用于在数据库中存储ServerRequest body和ServerResponse body。但当我试图得到一个对象时,我的请求就被绞死了。是否有实现此功能的示例代码。

  • 如果运行在负载均衡器之后,最好应该理解头。因此,在本例中,我想让类似于。如果需要的话,我将使用Netty服务器实现。

  • 我在LWJGL 3中使用OpenGL,我得到以下错误; 这是RenderUtil类,initGraphics是从我的主类的构造函数中调用的。在使用GLFW创建了一个窗口后,我还尝试调用initGraphics,该窗口也生成了类似的错误消息。 另外,我没有使用多线程。要创建一个窗口,我调用方法from my main method."

  • Vaadin dev ticket#9505说,已经添加了方法来获取当前的VaadinServlet、VaadinPortlet等等。 然而,我在类文档中没有看到任何这样的方法。例如,这两个页面: https://vaadin.com/api/com/vaadin/server/VaadinServletRequest.html https://vaadin.com/api/com/vaadin/

  • 我正在使用Spring5、Netty和Spring webflux开发和API网关。有时,我希望网关停止请求,但我也希望读取请求的主体以记录它,例如,并向客户机返回一个错误。 我尝试在WebFilter中通过订阅body来实现这一点。 当我这样做的时候,它在身体的内容很少的时候起作用。但当我有一个大的身体时,只有第一个元素的通量被读取,所以我不能有整个身体。知道怎么做吗?