最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

shiro并發(fā)人數(shù)登錄控制的實現(xiàn)代碼

 更新時間:2017年09月20日 10:14:19   作者:動力節(jié)點  
在做項目中遇到這樣的需求要求每個賬戶同時只能有一個人登錄或幾個人同時登錄,如果是同時登錄的多人,要么不讓后者登錄,要么踢出前者登錄,怎么實現(xiàn)這樣的功能呢?下面小編給大家?guī)砹藄hiro并發(fā)人數(shù)登錄控制的實現(xiàn)代碼,一起看看吧

在某些項目中可能會遇到如每個賬戶同時只能有一個人登錄或幾個人同時登錄,如果同時有多人登錄:要么不讓后者登錄;要么踢出前者登錄(強制退出)。比如spring security就直接提供了相應的功能;Shiro的話沒有提供默認實現(xiàn),不過可以很容易的在Shiro中加入這個功能。 

通過Shiro Filter機制擴展KickoutSessionControlFilter完成。 

首先來看看如何配置使用(spring-config-shiro.xml)  

kickoutSessionControlFilter用于控制并發(fā)登錄人數(shù)的 

Java代碼  

<bean id="kickoutSessionControlFilter" 
class="com.github.zhangkaitao.shiro.chapter18.web.shiro.filter.KickoutSessionControlFilter"> 
 <property name="cacheManager" ref="cacheManager"/> 
 <property name="sessionManager" ref="sessionManager"/> 
 <property name="kickoutAfter" value="false"/> 
 <property name="maxSession" value="2"/> 
 <property name="kickoutUrl" value="/login?kickout=1"/> 
</bean> 

cacheManager:使用cacheManager獲取相應的cache來緩存用戶登錄的會話;用于保存用戶—會話之間的關系的;

sessionManager:用于根據(jù)會話ID,獲取會話進行踢出操作的;

kickoutAfter:是否踢出后來登錄的,默認是false;即后者登錄的用戶踢出前者登錄的用戶;

maxSession:同一個用戶最大的會話數(shù),默認1;比如2的意思是同一個用戶允許最多同時兩個人登錄;

kickoutUrl:被踢出后重定向到的地址; 

shiroFilter配置 

Java代碼  

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> 
 <property name="securityManager" ref="securityManager"/> 
 <property name="loginUrl" value="/login"/> 
 <property name="filters"> 
  <util:map> 
  <entry key="authc" value-ref="formAuthenticationFilter"/> 
  <entry key="sysUser" value-ref="sysUserFilter"/> 
  <entry key="kickout" value-ref="kickoutSessionControlFilter"/> 
  </util:map> 
 </property> 
 <property name="filterChainDefinitions"> 
  <value> 
  /login = authc 
  /logout = logout 
  /authenticated = authc 
  /** = kickout,user,sysUser 
  </value> 
 </property> 
 </bean> 

此處配置除了登錄等之外的地址都走kickout攔截器進行并發(fā)登錄控制。 

測試

此處因為maxSession=2,所以需要打開3個瀏覽器(需要不同的瀏覽器,如IE、Chrome、Firefox),分別訪問http://localhost:8080/chapter18/進行登錄;然后刷新第一次打開的瀏覽器,將會被強制退出,如顯示下圖: 

KickoutSessionControlFilter核心代碼: 

Java代碼  

protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { 
 Subject subject = getSubject(request, response); 
 if(!subject.isAuthenticated() && !subject.isRemembered()) { 
 //如果沒有登錄,直接進行之后的流程 
 return true; 
 } 
 Session session = subject.getSession(); 
 String username = (String) subject.getPrincipal(); 
 Serializable sessionId = session.getId(); 
 //TODO 同步控制 
 Deque<Serializable> deque = cache.get(username); 
 if(deque == null) { 
 deque = new LinkedList<Serializable>(); 
 cache.put(username, deque); 
 } 
 //如果隊列里沒有此sessionId,且用戶沒有被踢出;放入隊列 
 if(!deque.contains(sessionId) && session.getAttribute("kickout") == null) { 
 deque.push(sessionId); 
 } 
 //如果隊列里的sessionId數(shù)超出最大會話數(shù),開始踢人 
 while(deque.size() > maxSession) { 
 Serializable kickoutSessionId = null; 
 if(kickoutAfter) { //如果踢出后者 
  kickoutSessionId = deque.removeFirst(); 
 } else { //否則踢出前者 
  kickoutSessionId = deque.removeLast(); 
 } 
 try { 
  Session kickoutSession = 
  sessionManager.getSession(new DefaultSessionKey(kickoutSessionId)); 
  if(kickoutSession != null) { 
  //設置會話的kickout屬性表示踢出了 
  kickoutSession.setAttribute("kickout", true); 
  } 
 } catch (Exception e) {//ignore exception 
 } 
 } 
 //如果被踢出了,直接退出,重定向到踢出后的地址 
 if (session.getAttribute("kickout") != null) { 
 //會話被踢出了 
 try { 
  subject.logout(); 
 } catch (Exception e) { //ignore 
 } 
 saveRequest(request); 
 WebUtils.issueRedirect(request, response, kickoutUrl); 
 return false; 
 } 
 return true; 
} 

此處使用了Cache緩存用戶名—會話id之間的關系;如果量比較大可以考慮如持久化到數(shù)據(jù)庫/其他帶持久化的Cache中;另外此處沒有并發(fā)控制的同步實現(xiàn),可以考慮根據(jù)用戶名獲取鎖來控制,減少鎖的粒度。

總結

以上所述是小編給大家介紹的shiro并發(fā)人數(shù)登錄控制的實現(xiàn)代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • Windows下如何安裝配置Redis環(huán)境

    Windows下如何安裝配置Redis環(huán)境

    這篇文章主要介紹了Windows下如何安裝配置Redis環(huán)境,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • 模仿mybatis-plus實現(xiàn)rpc調用

    模仿mybatis-plus實現(xiàn)rpc調用

    這篇文章主要為大家介紹了模仿mybatis-plus實現(xiàn)rpc調用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 淺談java多線程wait,notify

    淺談java多線程wait,notify

    這篇文章主要介紹了java多線程wait,notify,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面小編和大家一起來學習一下吧
    2019-05-05
  • Java基于正則表達式獲取指定HTML標簽指定屬性值的方法

    Java基于正則表達式獲取指定HTML標簽指定屬性值的方法

    這篇文章主要介紹了Java基于正則表達式獲取指定HTML標簽指定屬性值的方法,涉及java基于正則的HTML元素匹配相關操作技巧,需要的朋友可以參考下
    2017-01-01
  • java實現(xiàn)輸出任意整數(shù)的每一位

    java實現(xiàn)輸出任意整數(shù)的每一位

    這篇文章主要介紹了java實現(xiàn)輸出任意整數(shù)的每一位,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java實現(xiàn)抽獎功能解析

    java實現(xiàn)抽獎功能解析

    這篇文章主要為大家詳細介紹了java實現(xiàn)抽獎功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • SpringBoot中使用Ehcache的詳細教程

    SpringBoot中使用Ehcache的詳細教程

    EhCache 是一個純 Java 的進程內緩存框架,具有快速、精干等特點,是 Hibernate 中默認的 CacheProvider。這篇文章主要介紹了SpringBoot中使用Ehcache的相關知識,需要的朋友可以參考下
    2020-08-08
  • 詳解微信小程序 同步異步解決辦法

    詳解微信小程序 同步異步解決辦法

    這篇文章主要介紹了詳解微信小程序 同步異步解決辦法的相關資料,需要的朋友可以參考下
    2017-06-06
  • Java多線程生產者消費者模式實現(xiàn)過程解析

    Java多線程生產者消費者模式實現(xiàn)過程解析

    這篇文章主要介紹了Java多線程生產者消費者模式實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • java使用jdbc連接數(shù)據(jù)庫簡單實例

    java使用jdbc連接數(shù)據(jù)庫簡單實例

    這篇文章主要為大家詳細介紹了java使用jdbc連接數(shù)據(jù)庫的簡單實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評論

通榆县| 阳江市| 易门县| 通城县| 漠河县| 香港| 南郑县| 翼城县| 巫溪县| 峨边| 长沙市| 朝阳区| 海宁市| 泰和县| 田东县| 色达县| 北川| 乌审旗| 茂名市| 福贡县| 南木林县| 大安市| 开鲁县| 阳东县| 凌源市| 保德县| 视频| 台北县| 弥勒县| 六枝特区| 儋州市| 灵璧县| 冀州市| 渭源县| 大渡口区| 玛沁县| 鄂托克前旗| 朝阳市| 和田县| 宁波市| 贵德县|