1

我的Spring Boot Webflux -application ( Netty ) 使用Thymeleaf -templates输出 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"
}
4

1 回答 1

0

以下似乎有效:

@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.
  • 检索反应类型后需要完成的所有事情都需要包装在onXXXMono 的功能之一中(也许then也可以)。
  • 这也适用于重定向到需要来自反应类型结果的处理程序方法。所以说原始的 Mono 是 R2DB 插入的未来结果。如果我想重定向到结果视图,我可以使用.map { entity -> "redirect:/entity/${entity.id}" }.
于 2021-06-20T06:04:14.237 回答