使用Thymeleaf的Spring MVC,无需创建会话

iaqfqrcu  于 2023-03-28  发布在  Spring
关注(0)|答案(1)|浏览(120)

假设我正在使用Spring MVC和Thymeleaf,HTML页面foo使用HTTP POST从标准HTML表单向bar提交文本。我有一个BarController,看起来像这样:

@Controller
@RequestMapping("/bar")
public class BarController {

  @PostMapping(consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
  public String postText(@RequestParam("text") String text, final Model model) {
    model.addAttribute("submittedText", text);
    return "/bar";
  }

然后我的视图Thymeleaf模板文件对$submittedText做了一些事情。例如,它可以将文本放在HTML中:

<p>Submitted text: <span th:text="${submittedText}"></span></p>

我可以以这种方式将Spring MVC和Thymeleaf用作简单的模型/视图模板系统(即手动编写servlet之上的一层),而不创建任何后端会话吗?

我认为答案是“是的”,但我想让其他Spring MVC和ThymeleafMaven来运行它以确定。
我的理解是Spring MVC使用Java EE servlet会话,并且直到调用request.getSession()request.getSession(true)才创建会话。如果我没有声明任何会话变量,并且我没有声明任何flash属性,并且我直接委托给视图而没有重定向,那么就不需要会话,Spring也不会尝试检索会话。我假设这个场景与我简单地从头开始编写一个servlet来查看提交的数据并通过字符串连接生成HTML没有什么不同。
此外,我使用了Chrome开发者工具,没有看到任何会话cookie或URL重写与会话ID发生。
如果这是您的专业领域,请让我知道是否在我不知道的地方创建了会话,或者我应该注意的任何其他问题。谢谢。

xqnpmsa8

xqnpmsa81#

理论上你是对的。除非你显式地创建一个会话(使用request.getSession()request.getSession(true)或任何其他方式),否则你没有创建一个会话,因此会话的主要症状(即JSESSIONID cookie)将不可用。
我说“理论上”是因为,虽然你没有创建一个会话,但你的代码的其他部分可能会根据你试图做的事情创建一个会话,但在我看来,这里的情况并不是这样。
当你使用Spring时,如果你也使用Spring Security,你可以完全禁用会话-如果这是你的选择-通过使用/自定义SecurityFilterChain bean,像这样(下面的代码认为你使用的是Spring Security 6):

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
    http
        // ...
        .sessionManagement((session) -> session
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        );
    return http.build();
}

take a look at how Spring handles the SessionCreationPolicy and what each option (STATELESS, NEVER...) does
源代码中也有旧版本的示例,但它们与本文的示例相差不大。

相关问题