使用 Thymeleaf 时,Spring 安全会话范围似乎为空

Posted

技术标签:

【中文标题】使用 Thymeleaf 时,Spring 安全会话范围似乎为空【英文标题】:Spring security sessionscope appears to be null when using Thymeleaf 【发布时间】:2012-12-12 02:25:48 【问题描述】:

当使用 Spring Security 登录失败时,它会抛出异常并在我的 JSP 中显示如下:

<c:if test="$not empty error">
    <div class="errorblock">
        Your login attempt was not successful, try again.<br /> Caused :
        $sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message
    </div>
</c:if>

现在我正在从 JSP 更改为 Thymeleaf 并尝试做同样的事情,但是当登录失败时,sessionScope 变量似乎为空。

<div th:if="$error" class="errorblock" th:text="'testing ' + $sessionScope">

</div>

这会打印出 testing null 。当我将视图解析器改回 JSP 时,它运行良好。我想我做错了什么。有什么建议吗?

【问题讨论】:

【参考方案1】:

第二个和第一个不一样。如果您在没有变量名的情况下调用隐式 EL 变量 sessionScope,我不确定您应该得到什么。怎么样:

$sessionScope.SPRING_SECURITY_LAST_EXCEPTION.message

此外,您确定您的页面加入了会话吗?在 JSP 中有 session 指令控制会话范围是否可以通过 EL 获得。

<%@ page session="false|true" %>

【讨论】:

【参考方案2】:

在 Thymeleaf 中,您不能使用 sessionScope 令牌名称访问会话变量。你改用session。因此,您需要执行以下操作:

<div class="error" 
     th:if="$param.login_error"
     th:with="errorMsg=$session["SPRING_SECURITY_LAST_EXCEPTION"].message">
  Your login attempt was not successful, try again.<br />
  Reason: <span th:text="$errorMsg">Wrong input!</span> 
</div>

免责声明,根据 *** 规则:我是 Thymeleaf 的作者。

【讨论】:

有这方面的文档吗?或者我将如何使用 sessionsessionScope ?另外,param.login_error 来自哪里?它有效,但看起来像一个黑魔法。 param.login_error是Spring Security在登录错误后创建的请求参数。您将不得不为此阅读 Spring Security 文档。至于 session 范围,它首先在 Thymeleaf 主教程(“使用 Thymeleaf”,thymeleaf.org/documentation.html)的第 15 页(“上下文”小节)中介绍,然后在本教程的其余部分和其他教程和示例应用程序中使用。 复制粘贴你的答案,得到 org.xml.sax.SAXParseException;行号:104;列号:80;元素类型“div”必须后跟属性规范“>”或“/>”。问题在于 th:with 部分。 你如何在 javascript 中做到这一点? 你好,我可以通过 session 对象访问当前登录的用户(可能还有它的属性)以在 if 语句中使用吗?现在,如果我使用&lt;div th:text="$session.user"&gt;&lt;/div&gt; 进行测试,它不会呈现任何内容,也不会引发错误。谢谢【参考方案3】:

以下适用于 Thymeleaf 3.0 和 Bootstrap 4.1

<div th:if="$param.error and $session" th:with="errorMsg=$session['SPRING_SECURITY_LAST_EXCEPTION']">
     <div class="alert alert-dismissible alert-danger error">
          Reason: <span th:text="$errorMsg">Demo Invalid input</span>
     </div>
</div>

【讨论】:

以上是关于使用 Thymeleaf 时,Spring 安全会话范围似乎为空的主要内容,如果未能解决你的问题,请参考以下文章

使用 Thymeleaf 时,Spring 安全会话范围似乎为空

使用spring-boot-starter-web和thymeleaf时填充下拉列表

将分页与 Spring Boot 和 Thymeleaf 一起使用时出错

模板解析时出错。Spring boot 和 Thymeleaf

Spring Boot 和 Thymeleaf 在字段错误时返回 400 错误

Spring MVC 和 Thymeleaf 资源版本控制