编写 RedisSessionDao 类 继承 EnterpriseCacheSessionDAO
@Component
public class RedisSessionDao extends EnterpriseCacheSessionDAO {
private static final Logger logger = LoggerFactory.getLogger(Serializer.class);
@Resource
private RedisTemplate<String, Object> redisTemplate;
private final long timeOut = 24*60*60L;
/**
* The Redis key prefix for the sessions
*/
private String getKey(String originalKey) {
return "shiro_redis_session:" +originalKey;
}
@PostConstruct
public void init(){
logger.info("注入催收的序列/反序列类");
Serializer<Serializable> collectionSerializer=Serializer.getInstance();
redisTemplate.setDefaultSerializer(collectionSerializer);
//redisTemplate默认采用的其实是valueSerializer,就算是采用其他ops也一样,这是一个坑。
redisTemplate.setValueSerializer(collectionSerializer);
}
@Override
public void update(Session session) throws UnknownSessionException {
logger.debug("更新seesion,id=[{}]", session.getId().toString());
try {
redisTemplate.opsForValue().set(getKey(session.getId().toString()), session,timeOut,TimeUnit.MINUTES);
} catch (Exception e) {
logger.error(e.getMessage(),e);
}
}
@Override
protected void doUpdate(Session session) {
logger.debug("更新seesion,id=[{}]", session.getId().toString());
try {
redisTemplate.opsForValue().set(getKey(session.getId().toString()), session,timeOut,TimeUnit.MINUTES);
} catch (Exception e) {
logger.error(e.getMessage(),e);
}
}
@Override
public void delete(Session session) {
logger.debug("删除seesion,id=[{}]", session.getId().toString());
try {
String key=getKey(session.getId().toString());
redisTemplate.delete(key);
} catch (Exception e) {
logger.error(e.getMessage(),e);
}
}
@Override
protected void doDelete(Session session) {
logger.debug("删除seesion,id=[{}]", session.getId().toString());
try {
String key=getKey(session.getId().toString());
redisTemplate.delete(key);
} catch (Exception e) {
logger.error(e.getMessage(),e);
}
}
@Override
public Collection<Session> getActiveSessions() {
logger.info("获取存活的session");
return Collections.emptySet();
}
@Override
protected Serializable doCreate(Session session) {
Serializable sessionId = generateSessionId(session);
assignSessionId(session, sessionId);
logger.debug("创建seesion,id=[{}]", session.getId().toString());
try {
redisTemplate.opsForValue().set(getKey(session.getId().toString()), session,timeOut,TimeUnit.MINUTES);
} catch (Exception e) {
logger.error(e.getMessage(),e);
}
return sessionId;
}
@Override
protected Session doReadSession(Serializable sessionId) {
logger.debug("获取seesion,id=[{}]", sessionId.toString());
Session readSession = null;
try {
readSession=(Session) redisTemplate.opsForValue().get(getKey(sessionId.toString()));
} catch (Exception e) {
logger.error(e.getMessage());
}
return readSession;
}
}
序列化类 Serializer
public class Serializer <T extends Serializable> implements RedisSerializer<T> {
private Serializer(){}
public static volatile Serializer<Serializable> collectionSerializer=null;
public static Serializer<Serializable> getInstance(){
if(collectionSerializer==null){
synchronized (Serializer.class) {
if(collectionSerializer==null){
collectionSerializer=new Serializer<>();
}
}
}
return collectionSerializer;
}
@Override
public byte[] serialize(T t) throws SerializationException {
return SerializationUtils.serialize(t);
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
return SerializationUtils.deserialize(bytes);
}
}
ShrioConfig 配置
// 注入改写的redisSession
@Resource
private RedisSessionDao redisSessionDao;
@Bean
public SessionManager sessionManager() {
DefaultWebSessionManager mySessionManager = new DefaultWebSessionManager();
mySessionManager.setGlobalSessionTimeout(86400000L);
// 配置session 存储方式
mySessionManager.setSessionDAO(redisSessionDao);
return mySessionManager;
}
@Bean
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(adminAuthorizingRealm);
securityManager.setSessionManager(sessionManager());
return securityManager;
}