spring+shiro+redis實現session共用__spring+redis

來源:互聯網
上載者:User

利用spring的RedisTemplate實現session的存取,先配置applicationContext-shiro.xml

<!-- 會話管理器 -->    <bean id="sessionManager"          class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">        <property name="sessionValidationInterval" value="1800000"/>  <!-- 相隔多久檢查一次session的有效性 -->        <property name="globalSessionTimeout" value="1800000"/>        <property name="deleteInvalidSessions" value="true"/>        <property name="sessionValidationSchedulerEnabled" value="true"/><!-- 定時檢查失效的session -->        <!--<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>-->        <property name="sessionDAO" ref="sessionDAO"/>        <!--<property name="sessionIdCookie" ref="simpleCookie"/>-->        <property name="sessionIdCookie.name" value="shiro.sesssion"/>        <property name="sessionIdCookie.path" value="/"/>        <property name="sessionIdCookieEnabled" value="true"/>        <!--<property name="sessionIdCookie" ref="sessionIdCookie" />-->    </bean>    <!-- 會話DAO -->    <bean id="sessionDAO" class="com.ogmall.web.manager.cache.RedisSessionDao">        <property name="redisTemplate" ref="redisObjectTemplate"></property>    </bean><bean id="redisObjectTemplate" class="org.springframework.data.redis.core.RedisTemplate">        <property name="connectionFactory" ref="jedisConnectionFactory"/>        <!--如果不配置Serializer,那麼儲存的時候預設使用String,如果用User類型儲存,那麼會提示錯誤User can't cast to String。。  -->        <property name="keySerializer">            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>        </property>        <property name="valueSerializer">            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>        </property>        <property name="hashKeySerializer">            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>        </property>        <property name="hashValueSerializer">            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>        </property>    </bean><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">        <property name="maxTotal" value="600"></property>        <property name="maxIdle" value="300"></property>        <property name="minIdle" value="10"></property>        <property name="maxWaitMillis" value="2000"></property>        <property name="testOnBorrow" value="true"></property>        <property name="testOnReturn" value="true"></property>    </bean>    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">        <property name="hostName" value="192.168.1.149"/>        <property name="port" value="6379"/>        <property name="poolConfig" ref="jedisPoolConfig"></property>        <!--<property name="timeout" value="5000"></property>-->        <property name="usePool" value="true"></property>        <!--<property name="password" value="" />-->        <property name="database" value="10"/>    </bean>
RedisSessionDao.java

package com.ogmall.web.manager.cache;import org.apache.shiro.session.Session;import org.apache.shiro.session.UnknownSessionException;import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.data.redis.core.RedisTemplate;import java.io.Serializable;import java.util.Collection;import java.util.Collections;import java.util.concurrent.TimeUnit;/** * Created by Administrator on 2017/6/30 0030. */public class RedisSessionDao extends AbstractSessionDAO {    private RedisTemplate redisTemplate;    Logger log= LoggerFactory.getLogger(getClass());    /**     * The Redis key prefix for the sessions     */    private String keyPrefix = "shiro_redis_session_manager:";    private String getKey(String originalKey) {        return keyPrefix+originalKey;    }    @Override    public void update(Session session) throws UnknownSessionException {//        log.info("更新seesion,id=[{}]",session.getId().toString());        try {            redisTemplate.opsForValue().set(getKey(session.getId().toString()), session,30, TimeUnit.MINUTES);        } catch (Exception e) {            log.error(e.getMessage(),e);        }    }    @Override    public void delete(Session session) {        log.info("刪除seesion,id=[{}]",session.getId().toString());        try {            String key=getKey(session.getId().toString());            redisTemplate.delete(key);        } catch (Exception e) {            e.printStackTrace();        }    }    @Override    public Collection<Session> getActiveSessions() {        log.info("擷取存活的session");//        System.out.println(redisTemplate.opsForValue().get("shiro_redis_session_manager:*"));        return Collections.emptySet();    }    @Override    protected Serializable doCreate(Session session) {        Serializable sessionId = generateSessionId(session);        assignSessionId(session, sessionId);        log.info("建立seesion,id=[{}]",session.getId().toString());        try {            redisTemplate.opsForValue().set(getKey(session.getId().toString()), session,30,TimeUnit.MINUTES);        } catch (Exception e) {            log.error(e.getMessage());        }        return sessionId;    }    @Override    protected Session doReadSession(Serializable sessionId) {//        log.info("擷取seesion,id=[{}]",sessionId.toString());        Session session = null;        try {            session=(Session) redisTemplate.opsForValue().get(getKey(sessionId.toString()));//            System.out.println(System.currentTimeMillis()+"-"+session.getLastAccessTime().getTime()+"="+(System.currentTimeMillis()- session.getLastAccessTime().getTime()));//            if((System.currentTimeMillis()- session.getLastAccessTime().getTime())>1800000L){//30分鐘沒登入 到期//                System.out.println("刪除");//                delete(session);//                return null;//            }        } catch (Exception e) {            log.error(e.getMessage());        }        return session;    }    public RedisTemplate getRedisTemplate() {        return redisTemplate;    }    public void setRedisTemplate(RedisTemplate redisTemplate) {        this.redisTemplate = redisTemplate;    }}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.