关于Apache shiro如何实现一个账户同一时刻只有一个人登录

今天遇到一个项目问题,shiro如何实现一个账户同一时刻只有一session存在的问题,找了几篇文章,在这里就把核心的代码理了理,具体情况如下。


1.假设你使用了Apache shrio ,项目要求一个账户同一时刻只能有一个用户存在,那么你就应该在你的shiro配置文件中添加以下代码:


	
	
	  
    	  
	  
	
	
	
		
	
	
	
	

	
	
        
        
       
        
    	
    	
    


接下来你就应该在你的realm中添加下面的代码,这里主要是为了判断用户登录的账户是否已经登录过了。


@Autowired

private SessionDAO sessionDAO;

...............


接下来你就应该在realm中得到shiro 的缓存中得到所有的已经登录的账户,进行判断当前用户是否已经登录

//apache shiro获取所有在线用户
		Collection sessions = sessionDAO.getActiveSessions();
		for(Session session:sessions){
			String loginUsername = String.valueOf(session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY));//获得session中已经登录用户的名字
			
			if(username.equals(loginUsername)){  //这里的username也就是当前登录的username
				session.setTimeout(0);  //这里就把session清除,
				
			}
		}

2.SessionManager


这里有个可能出现bug的地方,可以通过配置sessionIdCookie属性,解决被服务器重写cookie中会话ID

  
      
      
      
      
      
  
  
  
      
  

完成这一切之后,本地单一用户登录就差不多完成了,由于自己技术有限,也是根据别人的方法来进行实现,仓促的完成了这篇文章,待我仔细研究后会更加细致的进行一些地方的说明,后期也会对该篇文章进行修改,不妥之处,希望大家多多谅解





你可能感兴趣的:(shiro,java框架相关,springmvc)