多個用戶不能使用同一個賬號同時登陸系統。
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下的用戶也會被踢出系統了。
