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 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 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 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 sessionIdBucket = redissonClient.getBucket(SuperConstant.GROUP_CAS + session.getId().toString()); sessionIdBucket.delete(); log.info("Session:{}被清除了",session); } @Override public Collection getActiveSessions() { return Collections.EMPTY_SET; } public RedisSessionDao(Long globalSessionTimeout) { this.globalSessionTimeout = globalSessionTimeout; } }