2012-12-26 95 views
3

時當用戶登錄失敗,春季安全爲空,它會拋出異常,並顯示在我的JSP是這樣的:春季安全sessionscope出現使用Thymeleaf

<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時,它可以很好地工作。我認爲我做錯了什麼。有什麼建議麼?

回答

16

在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> 

聲明,根據StackOverflow的規則:我Thymeleaf的作者。

+1

有沒有相關文件?或者我會如何使用'session'或'sessionScope'?另外,'param.login_error'從哪裏來?它的作品,但看起來像一個黑暗的魔法。 – Jaanus

+0

'param.login_error'是Spring Security在登錄錯誤後創建的請求參數。你將不得不去Spring Security文檔。至於「會話」範圍,它首先在主要的Thymeleaf教程(「使用Thymeleaf」,http://www.thymeleaf.org/documentation.html)的第15頁(子節「上下文」)中介紹,然後在整個本教程以及其他教程和示例應用程序的其餘部分。 –

+0

複製粘貼你的答案,得到org.xml.sax.SAXParseException; lineNumber:104; columnNumber:80;元素類型「div」後面必須有屬性規格,「>」或「/>」。問題在於:與部分。 – Kamil

4

第二個與第一個不一樣。我不確定如果您在沒有變量名稱的情況下調用隱式EL變量sessionScope應該得到什麼。如何:

${sessionScope.SPRING_SECURITY_LAST_EXCEPTION.message} 

另外,你確定你的頁面加入會話?在JSP中,有session指令控制會話作用域是否通過EL可用。

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