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

在Spring WebFlow中通过请求生命周期共享数据

韶兴德
2023-03-14

在Spring MVC中,我可以使用ThreadLocal通过请求在不同组件之间共享数据,当请求完成时数据将被自动清除。使用WebFlux,由于一个请求可以由多个线程处理,因此该解决方案将不起作用。如何实现类似的解决方案,以便最初一个WebFilter可以在请求上下文中设置一些数据,然后可以在控制器中访问和修改数据,以及请求经过的任何事件处理程序?

我尝试了订阅者Context,但它不起作用。这是我的代码。为什么这不起作用?是否有其他方法可以共享数据

public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    exchange.getResponse().beforeCommit(() -> {
        return Mono.subscriberContext()
         .map(context -> {
              context.hasKey("test"); // this returns false
         })
    }

    return Mono.subscriberContext()
        .map(context -> {context.put("test", "test");})
        .flatMap(chain.filter(exchange))
}

共有1个答案

洪雅健
2023-03-14

如果我没弄错的话,这是因为<code>beforeCommit()订户。

要将值添加到请求的订阅者上下文中。试试这个:

chain.filter(exchange)
  .subscriberContext(context -> context.put("KEY", "VALUE"));

您还可以在ServerWebExchange属性中共享值。不过,这是Spring Web Flux而不是Reactor。例如:

exchange.getAttributes().put("KEY", "VALUE");

现在,您可以在应用程序中访问<code>ServerWebExchange

exchange.getAttributes().get("KEY");
 类似资料:
  • 每个请求对象只在一个 servlet 的 service 方法的作用域内,或过滤器的 doFilter 方法的作用域内有效,除非该组件启用了异步处理并且调用了请求对象的 startAsync 方法。在发生异步处理的情况下,请求对象一直有效,直到调用 AsyncContext 的 complete 方法。容器通常会重复利用请求对象,以避免创建请求对象而产生的性能开销。开发人员必须注意的是,不建议在上

  • vue中,假如子组件在created发送了一个异步请求,父组件在mouted内发送一个异步请求,如何保证父组件在异步请求后能够拿到子组件异步数据。也就是说我希望在子组件和父组件异步都结束后拿到两者的值做一些操作,请问这个有什么比较好的办法嘛。

  • 忽视省略(elision)情况,带上生命周期的函数签名(function signature)有一些限制: 任何引用都必须拥有标注好的生命周期。 任何被返回的引用都必须有一个和输入量相同的生命周期或是静态类型(static)。 另外要注意,若会导致返回的引用指向无效数据,则返回不带输入量的引用是被禁止的。下面例子展示了一些带有生命周期的函数的有效形式: // 一个拥有生命周期 `'a` 的输入引用

  • 所有的数据都有生命周期,生命周期越长,需要的手续费(Energy)越多。生命周期终止,数据将被删除。从而可以淘汰无用数据。 日志型数据的生命周期是固定的一年,通过数据的生命周期,可以计算出日志写入时间,跨链读取将以这个时间和区块的时间比较,如果大于n*5分钟(n为两条链的逻辑距离),则日志数据是有效的。从而实现可信的跨链数据读取。

  • 问题内容: 我已经用了一年多的时间来使用Jersey,但偶然发现了一个我找不到答案的问题:如何截获(或连接)Jersey请求的生命周期? 理想情况下,我将能够在容器从网络接受请求的时间到调用处理程序方法的时间之间执行一些自定义过滤/验证/拒绝。如果有一种简单的方法可以按子路径过滤拦截器(例如,在/下有一个拦截器,在/ user /下有另一个拦截器,等等),则可以加分。 谢谢! 编辑:为了更清楚一点

  • 注:本文档提供的生命周期指的是 Universal App 的生命周期,它依赖 rax-app 提供的 runApp方法。 App 级生命周期 launch  在 App 启动时触发 使用生命周期 你可以使用 rax-app 提供的 useAppLaunch 来注册 App 级别的生命周期。 示例: import { useAppLaunch } from 'rax-app'; useAppLa