spring security 管理會話 多個用戶不可以使用同一個賬號登錄系統


多個用戶不能使用同一個賬號同時登陸系統。

1. 添加監聽器

在web.xml中添加一個監聽器,這個監聽器會在session創建和銷毀的時候通知Spring Security。

<listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>

2.添加過濾器

控制同步的session過濾器

<http auto-config='true'>
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    <session-management>
        <concurrency-control />
    </session-management>
</http>

3.1 后面的用戶禁止登陸

默認情況下,如果有一個人使用了一個賬號登錄了系統,其他人就不能再用這個賬號登錄了。

這個參數用來控制是否在會話數目超過最大限制時拋出異常,默認值是false,也就是不拋出異常,而是把之前的session都銷毀掉,所以之前登陸的用戶就會被踢出系統了。

現在我們把這個參數改為true,再使用同一個賬號同時登陸一下系統,看看會發生什么現象。

禁止同一賬號多次登錄
現在只要有一個人使用user/user登陸過系統,其他人就不能再次登錄了。這樣可能出現一個問題,如果有人登陸的時候因為某些問題沒有進行logout就退出了系統,那么他只能等到session過期自動銷毀之后,才能再次登錄系統。

3.2 后登陸的將先登錄的踢出系統

如果希望后登陸的用戶會把先登錄的用戶踢出系統,需要為concurrent-session-control設置一個參數。

<http auto-config='true'>
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    <concurrent-session-control exception-if-maximum-exceeded="false"/>
</http>

 

想測試一下的話,先打開firefox使用user/user登陸系統,然后再打開ie使用user/user登陸系統。這時ie下的user用戶會登陸成功,進入登陸成功頁面。而firefox下的用戶如何刷新頁面,就會顯示如下信息:

This session has been expired (possibly due to multiple concurrent logins being attempted as the same user).
            

這是因為先登錄的用戶已經被強行踢出了系統,如果他再次使用user/user登陸,ie下的用戶也會被踢出系統了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM