RedisSessionDao:
package com.shiroTest.session.dao;
import com.shiroTest.utils.JedisUtil;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;
import org.springframework.util.CollectionUtils;
import org.springframework.util.SerializationUtils;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class RedisSessionDao extends AbstractSessionDAO {
@Resource
private JedisUtil jedisUtil;
//设置前缀
private final String SHIRO_SESSION_PREFIX = "redis-session";
//2进制化
private byte[] getKey(String key){
return (SHIRO_SESSION_PREFIX+ key).getBytes();
}
//提取保存的方法
private void saveSession(Session session){
if(session!=null && session.getId()!=null){
//
byte[] key = getKey(session.getId().toString());
byte[] value = SerializationUtils.serialize(session);
jedisUtil.set(key,value);
//session过期
jedisUtil.expire(key,600);
}
}
@Override
protected Serializable doCreate(Session session) {
//生成sessionId
Serializable sessionId = generateSessionId(session);
//session 和 sessionId 进行捆绑
assignSessionId(session,sessionId);
saveSession(session);
return sessionId;
}
@Override
protected Session doReadSession(Serializable sessionId) {
if(sessionId == null){
return null;
}
byte[] key = getKey(sessionId.toString());
byte[] value = jedisUtil.getValue(key);
//deserialize 反序列化
return (Session) SerializationUtils.deserialize(value);
}
public void update(Session session) throws UnknownSessionException {
saveSession(session);
}
public void delete(Session session) {
if(session!=null && session.getId()!=null){
byte[] key = getKey(session.getId().toString());
jedisUtil.del(key);
}
}
public Collection<Session> getActiveSessions() {
Set<byte[]> keys = jedisUtil.getAllKey(SHIRO_SESSION_PREFIX);
Set<Session> sessions = new HashSet<Session>();
if (!CollectionUtils.isEmpty(keys)){
for(byte[] key: keys){
Session session = (Session) SerializationUtils.deserialize(jedisUtil.getValue(key));
sessions.add(session);
}
}
return sessions;
}
}
SessionManager:
package com.shiroTest.session;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.SessionKey;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.session.mgt.WebSessionKey;
import javax.servlet.ServletRequest;
import java.io.Serializable;
public class CustomSessionManager extends DefaultWebSessionManager {
@Override
protected Session retrieveSession(SessionKey sessionKey) throws UnknownSessionException {
Serializable sessionId = getSessionId(sessionKey);
ServletRequest request = null;
//判断类型是否为WebSessionKey
if(sessionKey instanceof WebSessionKey){
request = ((WebSessionKey) sessionKey).getServletRequest();
}
if(request!=null && sessionId!=null){
return (Session) request.getAttribute(sessionId.toString());
}
Session session = super.retrieveSession(sessionKey);
if (request!=null && sessionId !=null){
request.setAttribute(sessionId.toString(),session);
}
return session;
}
}
JedisUtil:
package com.shiroTest.utils;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import javax.annotation.Resource;
import java.util.Set;
@Component
public class JedisUtil {
@Resource
private JedisPool jedisPool;
//获取jedis资源
private Jedis getResource(){
return jedisPool.getResource();
}
public byte[] set(byte[] key, byte[] value) {
Jedis jedis = getResource();
try {
jedis.set(key,value);
} finally {
jedis.close();
}
return value;
}
//设置超时时间 单位s
public void expire(byte[] key, int i) {
Jedis jedis = getResource();
try {
jedis.expire(key,i);
}finally {
jedis.close();
}
}
public byte[] getValue(byte[] key) {
Jedis jedis = getResource();
try {
return jedis.get(key);
}finally {
jedis.close();
}
}
public Long del(byte[] key) {
Jedis jedis = getResource();
try {
return jedis.del(key);
}finally {
jedis.close();
}
}
public Set getAllKey(String SHIRO_SESSION_PREFIX) {
Jedis jedis = getResource();
try {
return jedis.keys((SHIRO_SESSION_PREFIX+"*").getBytes());
}finally {
jedis.close();
}
}
}