shiro 使用redis做session共享

1.在securityManager中注入sessionManager配置如下:

      
      
      
  

2.配置sessionManager

  
    
        
        

        
        

        
        

        
        

        
        
    

其中的sessionDAO就是用来操作session的存取的,因此需要注入我们自定义的shiroSessionRedisDAO

3.初始化bean shiroSessionRedisDAO

   
        
    

其中ShiroSessionRedisDAO就是我们继承CachingSessionDAO的自定义实现类,在这个类里面 注入我们需要操作redis的cache类
4.ShiroSessionRedisDAO 代码如下:

public class ShiroSessionRedisDAO extends CachingSessionDAO {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    private RedisCache redisCache;

    public RedisCache getRedisCache() {
        return redisCache;
    }

    public void setRedisCache(RedisCache redisCache) {
        this.redisCache = redisCache;
    }


    @Override
    protected void doUpdate(Session session) {
        this.saveSession(session);
    }

    @Override
    protected void doDelete(Session session) {
        if (session == null || session.getId() == null) {
            logger.error("session or session id is null");
            return ;
        }
        //根据session id删除session
        redisCache.evict(session.getId());
    }

  
    @Override
    protected Serializable doCreate(Session session) {
        Serializable sessionId = this.generateSessionId(session);
        this.assignSessionId(session, sessionId);
        this.saveSession(session);
        return sessionId;
    }

 
    @Override
    protected Session doReadSession(Serializable sessionId) {
        if(sessionId == null){
            logger.error("传入的 session id is null");
            return null;
        }
        return redisCache.get(sessionId,Session.class);
    }

    /**
     * 将session 保存进redis 中
     * @param session 要保存的session
     */
    private void saveSession(Session session) {
        if (session == null || session.getId() == null) {
            logger.error("session or session id is null");
            return ;
        }
        redisCache.put(session.getId(),session);

    }
}

5.目前的问题是一个请求shiro会多次调用doUpdate,导致对redis的压力比较大,这个以后再想办法优化吧。

你可能感兴趣的