Thymeleaf中#session.removeAttribute执行异常原因咨询
问题原因
- Thymeleaf的SpringEL表达式在模板中默认禁止执行有副作用的方法,
removeAttribute()属于修改session状态的操作,违背了模板作为视图层仅负责渲染数据、不修改后端状态的设计原则,因此触发解析异常。 - 报错
org.attoparser.ParseException是模板解析器直接拒绝了这种改变上下文状态的方法调用导致的。
解决方法
- 后端处理session属性移除
在控制器的请求处理方法中完成message属性的移除,不要在模板中操作:
@GetMapping("/signup") public String showSignupPage(HttpSession session) { session.removeAttribute("message"); return "signup"; }
- 模板仅取值,后端自动清理
如果需要显示message后自动移除,可以在后端读取属性后立即清理,再将值传递给模板渲染:
@GetMapping("/signup") public String showSignupPage(HttpSession session, Model model) { String message = (String) session.getAttribute("message"); if (message != null) { model.addAttribute("message", message); session.removeAttribute("message"); } return "signup"; }
模板中直接取值即可:
<div th:if="${message}" th:text="${message}"></div>
- 使用
@SessionAttributes配合清理(可选)
通过Spring的注解标记session属性,在请求完成后自动清理:
@SessionAttributes("message") @Controller public class SignupController { @GetMapping("/signup") public String showSignupPage(SessionStatus sessionStatus) { sessionStatus.setComplete(); return "signup"; } }
内容的提问来源于stack exchange,提问作者Vishal Srivastava
相关产品推荐
相关产品推荐

