apache shiro踢出用戶: 產(chǎn)品要求用戶只能在同一個(gè)地方登錄,如果之前在其他機(jī)器或者瀏覽器上登錄,講之前登錄賬號(hào)踢出。applicationContext-shiro.xml配置: 在默認(rèn)的shiro配置上增加如下配置(本文假設(shè)你已經(jīng)使用過(guò)apache shiro,并且已經(jīng)使用shiro成功實(shí)現(xiàn)登錄功能):
<bea id="sessionDAO" class="org.apache.shiro.session.mgt.eis.MemorySessionDAO"/> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="sessionDAO" ref="sessionDAO"/> </bean> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="shiroDbRealm" /> <property name="cacheManager" ref="shiroCacheManager" /> <property name="sessionManager" ref="sessionManager" /> </bean>
然后在ShiroDbRealm中的認(rèn)證方法中增加如下代碼,代碼主要目的就是根據(jù)當(dāng)前登錄名獲取之前使用同樣登錄名登錄后的session @Autowired private SessionDAO sessionDAO; ... String loginName=token.getUsername(); Session currentSession = null; Collection<Session> sessions = sessionDAO.getActiveSessions(); for(Session session:sessions){ if(loginName.equals(String.valueOf(session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY))) { session.setTimeout(0);//設(shè)置session立即失效,即將其踢出系統(tǒng) break; } } apache shiro獲取所有在線用戶:
for(Session session:sessions){ System.out.println("登錄ip:"+session.getHost()); System.out.println("登錄用戶"+session.getAttribute(DefaultWebContext.PRINCIPALS_SESSION_KEY)); System.out.println("最后操作日期:"+session.getLastAccessTime()); }
紅色部分:MemorySessionDAO ,切記不能使用EnterpriseCacheSessionDAO,使用該類的時(shí)候,雖然也能起到踢出用戶的作用,但是后登錄的用戶隔兩三分鐘就會(huì)session自動(dòng)失效。
點(diǎn)擊去我的個(gè)人站點(diǎn)查看原文
更多文章,歡迎關(guān)注俺的微信訂閱號(hào),每天一篇小筆記,每天提高一點(diǎn)點(diǎn): 公眾號(hào):enilu123 |
|