1. 程式人生 > >一個使用者在同一個瀏覽器多次登入shiro互踢的問題

一個使用者在同一個瀏覽器多次登入shiro互踢的問題

關鍵程式碼如下:

//判斷是否同一個使用者再同一個瀏覽器中登入,是就不踢除
 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
        //獲取基於使用者名稱和密碼的令牌  
        //實際上這個authcToken是從LoginController裡面currentUser.login(token)傳過來的  
        //兩個token的引用都是一樣的,本例中是[email protected]
/*UsernamePasswordToken token = (UsernamePasswordToken)authcToken;*/ String username = (String)authcToken.getPrincipal(); BaseUser user = webUserService.webLogin(username); //apache shiro獲取所有線上使用者 Collection<Session> sessions = sessionDAO.getActiveSessions(); for(Session session:sessions){ String loginUsername = String.valueOf(session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY)); //判斷是否同一個使用者再同一個瀏覽器中登入,是就不踢除 if (SecurityUtils.getSubject().getSession().getId().equals(session.getId())) break; //獲得session中已經登入使用者的名字 if(username.equalsIgnoreCase(loginUsername) ){ //這裡的username也就是當前登入的username sessionDAO.delete(session); //這裡就把session清除 break; } } //返回值例項化 //身份證認證授權轉移到 com.fh.controller.system.login LoginController類下的login()方法中 if( user !=null){ //設定使用者session Session session = SecurityUtils.getSubject().getSession(); session.setAttribute(USER_SESSION, user); return new SimpleAuthenticationInfo(user.getUserCode(), user.getUserPassword(), getName()); }else{ return null; } }