【问题标题】:Webflux store result of Mono to session variableWebflux 将 Mono 的结果存储到会话变量
【发布时间】:2021-06-14 06:16:29
【问题描述】:

我的 Spring Boot Webflux-应用程序 (Netty) 使用 Thymeleaf-模板输出 HTML。在一个处理程序方法中,我使用WebClient 通过外部 id-provider 进行身份验证。 现在我想将生成的身份验证令牌存储在会话变量中,以便我可以在后续的 Controller/Handler 方法中重用它。 如果我将令牌存储在模型变量中,Spring/Webflux 在渲染之前解析Mono 并提供生成的令牌字符串供视图(Thymeleaf 模板)使用。但我找不到将令牌存储在会话变量中的方法。 WebSession 对我来说已经足够了,因为我不会运行具有多个节点的应用程序。

我尝试过的代码(Kotlin):

@PostMapping("/login")
fun login(@Valid loginForm: LoginForm, model: Model, webSession: WebSession): String {
  val tokenMono: Mono<String> = loginService.login(loginForm.email, loginForm.password)
  model.addAttribute("token", tokenMono) // works and the token is available as a String in resulting view template
  webSession.addAttribute("token", tokenMono) // session-variable "token" is null in subsequent requests.
  return "login/success"
}

【问题讨论】:

    标签: java spring spring-boot kotlin webflux


    【解决方案1】:

    以下似乎有效:

    @PostMapping("/login")
    fun login(@Valid loginForm: LoginForm, webSession: WebSession): Mono<String> {
       return loginService.login(loginForm.email, loginForm.password)
         .doOnNext { token ->
            webSession.attributes["token"] = token
         }
         .map { token -> "login/success" }
    }
    

    主要学习:

    • 模板视图名称(此处为“login/success”)可以包裹在Mono 中。
    • 检索反应类型后需要做的所有事情都需要封装在 Mono 的 onXXX 函数之一中(也许 then 也可以)。
    • 这也适用于重定向到需要反应类型结果中的某些内容的处理程序方法。所以说原始的 Mono 是 R2DB 插入的未来结果。如果我想重定向到结果视图,我可以使用.map { entity -&gt; "redirect:/entity/${entity.id}" }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多