[转载]spring security 的 logout 功能
轉載自:http://lengyun3566.iteye.com/blog/1114464
理解退出功能
術語退出(Logout)指的是用戶使其安全session失效的一種操作。一般來說,用戶在退出后,將會被重定向到站點的非安全保護的界面。讓我們在站點的頁頭部分添加一個“Log Out”的鏈接,并再次訪問站點以了解其如何實現功能的。
在站點頁頭上添加“Log Out”鏈接
正如我們在第二章中討論的那樣,Spring Security將會監視一些特殊的URL,這些URL將會觸發過濾器鏈中的一個或多個過濾器。用戶實現退出的URL標識為/j_spring_security_logout。在header.jsp中添加一個退出的鏈接與為一個錨標簽(即a標簽)添加適合的href屬性:
?
?
Html代碼?- Log Out
- " quality="high" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">?
?
如果你重新加載站點并點擊“Log Out”鏈接,你會發現被重置到登錄form的界面?,F在看來,登錄和退出是很有趣的!
【使用JSTL URL標簽來處理相對URL。我們使用了JSTL核心庫中的url標簽來保證提供的URL在部署的web應用中能夠被正確處理。url標簽將提供的URL按照相對路徑(以/開始)進行處理。你可能會見過其他類似的實現技術如使用JSP的代碼((<%= request.getContextPath() %>)),但是JSTL的url標簽能夠使得你免于編寫內聯的代碼?!?/p>
讓我們看一下在這個簡單操作的背后都發生了什么。
退出是怎么實現的
當我們點擊退出鏈接時,到底發生了什么?
需要記住的一點是任何URL請求在被servlet處理之前,都會經過Spring Security的過濾器鏈。所以,/j_spring_security_logout這個URL請求并非對應系統中的一個JSP,也不必有一個真正的JSP或者Spring MVC的目標來對其進行處理。這種類型的URL通常被稱為虛擬URL。
?
請求/j_spring_security_logout的URL被o.s.s.web.authentication.logout.LogoutFilter過濾器所攔截。在Spring Security的眾多默認過濾器中,LogoutFilter專門匹配這個虛擬URL并執行相應的操作。
?
讓我們快速地查看一下Spring Security的security命名空間提供的默認退出功能:
?
Xml代碼? " quality="high" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">???
?
基于這個基本配置,系統將會尋找在logout-url屬性配置的URL并實現用戶的退出。使得用戶退出系統將會涉及如下的三個步驟:
1.??????使得HTTP session失效(如果invalidate-session屬性被設置為true);
2.???????清除SecurityContex(真正使得用戶退出);
3.???????將頁面重定向至logout-success-url指明的URL。
以下的圖片闡述了退出的過程:
?o.s.s.web.authentication.logout.LogoutHandler接口的實現類可以在用戶通過LogoutFilter退出時被調用。你可以實現自己的LogoutHandler(盡管比較復雜)并將其關聯到LogoutFilter的生命周期中。通過LogoutFilter默認設置的LogoutHandler將會清除session以及remember me相關的功能,所以用戶的session中不會再持有認證相關的信息。最后,通過一個o.s.s.web.
authentication.logout.LogoutSuccessHandler接口的默認實現,頁面得以重定向到一個URL。默認實現中會將頁面重定向到我們配置的成功退出URL地址(默認為/),但是我們自定義任何系統在用戶退出時想要的操作。值得注意的是,退出的處理不應該拋出異常,因為很重要的一點是要在用戶的安全session中避免可能出現的潛在不一致性。所以在實現自己的安全處理時要保證異常被正確的處理和記錄。
修改logout URL
讓我們嘗試重寫默認的logout URL來提供一個修改自動設置的簡單例子。我們將會修改logout URL為/logout。
修改dogstore-security.xml配置文件來包含<logout>元素如下的代碼所示:
?
?
Xml代碼? ... .. " quality="high" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">??
修改/common/header.jsp文件來改變logout鏈接的herf屬性以匹配新的URL:
?
?
Html代碼?- Log Out
- " quality="high" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">?
?
重新啟動應用并進行嘗試。你可以發現使用/logout URL取代了/j_spring_security_logout實現用戶的退出。你可能也會發現當你嘗試/j_spring_security_logout這個地址時,你會得到一個Page not Found(404)的錯誤,是因為這個URL不與任何一個實際的servlet資源相對應并且不會被過濾器所處理。
Logout配置命令
<logout>元素包含其他的配置指令以實現更復雜的退出功能,介紹如下:
| 屬性 | 描述 |
| invalidate-session | 如果被設置為true,用戶的HTTP session將會在退出時被失效。在一些場景下,這是必要的(如用戶擁有一個購物車時) |
| logout-success-url | 用戶在退出后將要被重定向到的URL。默認為/。將會通過HttpServletResponse.redirect來處理。 |
| logout-url | LogoutFilter要讀取的URL(在例子中,我們改變了它的設置)。 |
| success-handler-ref | 對一個LogoutSuccessHandler實現的引用。 |
?
轉載于:https://www.cnblogs.com/kevin443/p/7726970.html
總結
以上是生活随笔為你收集整理的[转载]spring security 的 logout 功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git使用教程问题列表
- 下一篇: XML知识点概念小摘