package com.project.shiro.util.redis; import cn.wisenergy.service.common.utils.ByteUtil; import cn.wisenergy.service.common.utils.redis.RedisClient; import cn.wisenergy.service.common.utils.redis.RedisConsts; import org.apache.shiro.session.Session; import org.apache.shiro.session.UnknownSessionException; import org.apache.shiro.session.mgt.eis.AbstractSessionDAO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Resource; import java.io.IOException; import java.io.Serializable; import java.util.Collection; import java.util.HashSet; import java.util.Set; public class ShiroRedisSessionDAO extends AbstractSessionDAO { private static Logger logger = LoggerFactory.getLogger(ShiroRedisSessionDAO.class); //注入redisClient实例 @Resource(name = "redisClient") private RedisClient redisClient; /** * shiro-redis的session对象前缀 */ private String keyPrefix = RedisConsts.ADMIN_SHIRO_SESSION_KEY; @Override public void update(Session session) throws UnknownSessionException { this.saveSession(session); } private void saveSession(Session session) throws UnknownSessionException { if (session == null || session.getId() == null) { logger.error("session or session id is null"); return; } this.redisClient.setAndExpire(this.getPreStringKey(session.getId()), session, RedisConsts.ADMIN_SHIRO_SESSION_EXPIRE); } @Override public void delete(Session session) { if (session == null || session.getId() == null) { logger.error("session or session id is null"); return; } redisClient.del(getPreStringKey(session.getId())); } @Override public Collection<Session> getActiveSessions() { Set<Session> sessions = new HashSet<Session>(); Set<byte[]> keys = null; try { keys = redisClient.keys(ByteUtil.objectToBytes(this.keyPrefix + "*")); } catch (IOException e) { e.printStackTrace(); } if (keys != null && keys.size() > 0) { for (byte[] key : keys) { Session s = null; try { s = (Session) ByteUtil.bytesToObject(redisClient.get(key)); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } sessions.add(s); } } return sessions; } @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; } Session s = (Session) redisClient.get(this.getPreStringKey(sessionId)); return s; } /** * 获得String类型的key * * @param * @return */ private String getPreStringKey(Serializable sessionId) { String preKey = this.keyPrefix + sessionId; return preKey; } public String getKeyPrefix() { return keyPrefix; } public void setKeyPrefix(String keyPrefix) { this.keyPrefix = keyPrefix; } public void setRedisClient(RedisClient redisClient) { this.redisClient = redisClient; } public RedisClient getRedisClient() { return redisClient; } }