Shared use Redis achieve Session

Maven relies

<!-- Shiro核心包 -->
	<dependency>
		<groupId>org.apache.shiro</groupId>
		<artifactId>shiro-core</artifactId>
		<version>1.2.3</version>
	</dependency>
	<dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.2.3</version>
        </dependency>
 
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-web</artifactId>
            <version>1.2.2</version>
        </dependency>
 
<!-- redis -->
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.5.0</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>1.6.2.RELEASE</version>
    </dependency>
 

JedisUtil

@Component
public class JedisUtil {
    @Autowired
    private JedisConnectionFactory jedisConnectionFactory;
 
    private JedisConnection getJedis(){
        return jedisConnectionFactory.getConnection();
    }
 
    public byte[] set(byte[] key, byte[] value) {
        JedisConnection jedis = getJedis();
        try {
            jedis.set(key,value);
            return value;
        } finally {
            jedis.close();
        }
    }
 
    public void expire(byte[] key, int i) {
        JedisConnection jedis = getJedis();
        try {
            jedis.expire(key,i);
        } finally {
            jedis.close();
        }
    }
 
    public byte[] get(byte[] key) {
        JedisConnection jedis = getJedis();
        try {
            return jedis.get(key);
        } finally {
            jedis.close();
        }
    }
 
    public void del(byte[] key) {
        JedisConnection jedis = getJedis();
        try {
            jedis.del(key);
        } finally {
            jedis.close();
        }
    }
 
    public Set<byte[]> keys(String shiro_session_prefix) {
        JedisConnection jedis = getJedis();
        try {
            return jedis.keys((shiro_session_prefix + "*").getBytes());
        } finally {
            jedis.close();
        }
    }
}

RedisSessionDao

public class RedisSessionDao extends AbstractSessionDAO {

    @Autowired
    private JedisUtil jedisUtil;

    private final String shiro_session_prefix = "shiro-session:";

    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);
            jedisUtil.expire(key,600);
        }
    }

    @Override
    protected Serializable doCreate(Session session) {
        Serializable sessionID = generateSessionId(session);
        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.get(key);
        return (Session)SerializationUtils.deserialize(value);
    }

    @Override
    public void update(Session session) throws UnknownSessionException {
        saveSession(session);
    }

    @Override
    public void delete(Session session) {
        if(session == null && session.getId() != null){
            return;
        }
        byte[] key = getKey(session.getId().toString());
        jedisUtil.del(key);

    }

    @Override
    public Collection<Session> getActiveSessions() {
        Set<byte[]> keys = jedisUtil.keys(shiro_session_prefix);
        Set<Session> sessions = new HashSet<>();
        if(CollectionUtils.isEmpty(keys)){
            return sessions;
        }
        for(byte[] key:keys){
            Session session = (Session)SerializationUtils.deserialize(jedisUtil.get(key));
            sessions.add(session);
        }
        return sessions;
    }
}

CustomSessionManager

public class CustomSessionManager extends DefaultWebSessionManager {
    @Override
    protected Session retrieveSession(SessionKey sessionKey) throws UnknownSessionException {
        Serializable sessionId = getSessionId(sessionKey);
        ServletRequest request = null;
        if (sessionKey instanceof WebSessionKey) {
            request = ((WebSessionKey)sessionKey).getServletRequest();
        }
        if(request != null && sessionId != null){
            Session session = (Session)request.getAttribute(sessionId.toString());
            if(session != null){
                return session;
            }
        }
        Session session = super.retrieveSession(sessionKey);
        if(request != null && sessionId != null){
            request.setAttribute(sessionId.toString(),session);
        }
        return session;
    }
}

spring-shiro.xml

    <!-- redisSessionDao -->
<bean id="redisSessionDao" class="com.xinjianqiao.mian.session.RedisSessionDao"/>

    <!-- Session Manager -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.CustomSessionManager">
        <property name="sessionDAO" ref="redisSessionDao"/>
</bean>

 

Guess you like

Origin blog.csdn.net/qq_42239765/article/details/92382244