假设我正在使用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发生。
如果这是您的专业领域,请让我知道是否在我不知道的地方创建了会话,或者我应该注意的任何其他问题。谢谢。
1条答案
按热度按时间xqnpmsa81#
理论上你是对的。除非你显式地创建一个会话(使用
request.getSession()
或request.getSession(true)
或任何其他方式),否则你没有创建一个会话,因此会话的主要症状(即JSESSIONID cookie)将不可用。我说“理论上”是因为,虽然你没有创建一个会话,但你的代码的其他部分可能会根据你试图做的事情创建一个会话,但在我看来,这里的情况并不是这样。
当你使用Spring时,如果你也使用Spring Security,你可以完全禁用会话-如果这是你的选择-通过使用/自定义SecurityFilterChain bean,像这样(下面的代码认为你使用的是Spring Security 6):
take a look at how Spring handles the SessionCreationPolicy and what each option (STATELESS, NEVER...) does。
源代码中也有旧版本的示例,但它们与本文的示例相差不大。