zoukankan      html  css  js  c++  java
  • Shiro会话管理

    Shiro Session管理

    • SessionManager、SessionDAO
    • Redis实现Session共享
    • Redis实现Session共享存在的问题
    依赖
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.8.0</version>
    </dependency>
    
    spring-redis.xml
    <bean class="redis.clients.jedis.JedisPool">
        <constructor-arg ref="jedisPoolConfig" />
        <constructor-arg value="127.0.0.1" />
        <constructor-arg value="6379" />
    </bean>
    
    <bean class="redis.clients.jedis.JedisPoolConfig" id="jedisPoolConfig" />
    
    spring.xml
    <!-- 创建SecurityManager对象-->
    <bean class="org.apache.shiro.web.mgt.DefaultWebSecurityManager" id="securityManager">
        <property name="realm" ref="realm" />
        <property name="sessionManager" ref="sessionManager" />
    </bean>
    <bean class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager" id="sessionManager">
        <property name="sessionDAO" ref="redisSessionDao" />
    </bean>
    <bean class="com.imooc.session.RedisSessionDao" id="redisSessionDao" />
    
    JedisUtil.java
    public class JedisUtil {
        @Autowired
        private JedisPool jedisPool;
    
        private Jedis getResource() {
            return jedisPool.getResource();
        }
    
        public byte[] set(byte[] key, byte[] value) {
            Jedis jedis = getResource();
            try {
                jedis.set(key, value);
                return value;
            } finally {
                jedis.close();
            }
        }
    
        public void expire(byte[] key, int i) {
            Jedis jedis = getResource();
            try {
                jedis.expire(key, i);
            } finally {
                jedis.close();
            }
        }
    
        public byte[] get(byte[] key) {
            Jedis jedis = getResource();
            try {
                return jedis.get(key);
            } finally {
                jedis.close();
            }
        }
    
        public void del(byte[] key) {
            Jedis jedis = getResource();
            try {
                jedis.del(key);
            } finally {
                jedis.close();
            }
        }
    
        public Set<byte[]> keys(String shiro_session_prefix) {
            Jedis jedis = getResource();
            try {
                return jedis.keys((shiro_session_prefix + "*").getBytes());
            } finally {
                jedis.close();
            }
        }
    }
    
    
    RedisSessionDao.java
    public class RedisSessionDao extends AbstractSessionDAO {
    
        @Resource
        private JedisUtil jedisUtil;
    
        private final String SHIRO_SESSION_PREFIX = "imooc-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);
            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.java
    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;
        }
    }
    
  • 相关阅读:
    【读书笔记】构建之法(CH4~CH6)
    【进度总结】第一个web应用程序(未完成)
    【读书笔记】构建之法(CH1~CH3)
    【进度总结】软件工程选题报告
    Intro Of Myself
    【读书笔记】人月神话
    .net知识系列之二:(net内置对象request,reponse,server,session,cookie,application,viewstate)
    .net知识系列之一:(XHTML语言,静态网页,动态网页,web服务器)
    Java—常量和变量
    Java入门
  • 原文地址:https://www.cnblogs.com/sanjun/p/10007727.html
Copyright © 2011-2022 走看看