package com.whyc.config;
|
|
import com.whyc.constant.SuperConstant;
|
import com.whyc.util.ShiroRedissionSerialize;
|
import io.swagger.annotations.ApiModel;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.shiro.session.Session;
|
import org.apache.shiro.session.UnknownSessionException;
|
import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;
|
import org.redisson.Redisson;
|
import org.redisson.api.RBucket;
|
import org.redisson.api.RedissonClient;
|
import org.redisson.config.Config;
|
import org.redisson.config.SingleServerConfig;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
import org.springframework.context.annotation.DependsOn;
|
import org.springframework.util.StringUtils;
|
|
import javax.annotation.Resource;
|
import java.io.Serializable;
|
import java.util.Collection;
|
import java.util.Collections;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* 实现Shiro session的memcached集中式管理
|
*/
|
@Slf4j
|
public class RedisSessionDao extends AbstractSessionDAO {
|
|
@Autowired
|
RedissonClient redissonClient;
|
|
private Long globalSessionTimeout;
|
|
/**
|
* 保存Session
|
* @param session
|
* @return
|
*/
|
@Override
|
protected Serializable doCreate(Session session) {
|
Serializable sessionId = generateSessionId(session);
|
assignSessionId(session,sessionId);
|
|
//将Session存入redis
|
RBucket<String> sessionIdBucket = redissonClient.getBucket(SuperConstant.GROUP_CAS + sessionId.toString());
|
sessionIdBucket.trySet(ShiroRedissionSerialize.serialize(session),globalSessionTimeout, TimeUnit.MILLISECONDS);
|
log.info("session创建:SessionId:{}",session.getId().toString());
|
return sessionId;
|
}
|
|
/**
|
* 读取Session
|
* @param sessionId
|
* @return
|
*/
|
@Override
|
protected Session doReadSession(Serializable sessionId) {
|
RBucket<String> sessionIdBucket = redissonClient.getBucket(SuperConstant.GROUP_CAS + sessionId.toString());
|
Session session = (Session) ShiroRedissionSerialize.deserialize(sessionIdBucket.get());
|
return session;
|
}
|
|
/**
|
* 更新Session
|
* @param session
|
* @throws UnknownSessionException
|
*/
|
@Override
|
public void update(Session session) throws UnknownSessionException {
|
RBucket<String> sessionIdBucket = redissonClient.getBucket(SuperConstant.GROUP_CAS + session.getId().toString());
|
sessionIdBucket.set(ShiroRedissionSerialize.serialize(session),globalSessionTimeout,TimeUnit.SECONDS);
|
log.info("修改为SessionId:{}",session.getId().toString());
|
}
|
|
/**
|
* 清除Session
|
* @param session
|
*/
|
@Override
|
public void delete(Session session) {
|
RBucket<String> sessionIdBucket = redissonClient.getBucket(SuperConstant.GROUP_CAS + session.getId().toString());
|
sessionIdBucket.delete();
|
log.info("Session:{}被清除了",session);
|
}
|
|
@Override
|
public Collection<Session> getActiveSessions() {
|
return Collections.EMPTY_SET;
|
}
|
|
public RedisSessionDao(Long globalSessionTimeout) {
|
this.globalSessionTimeout = globalSessionTimeout;
|
}
|
}
|