spring+shiro+redis實現session共享
阿新 • • 發佈:2019-02-14
利用spring的RedisTemplate實現session的存取,先配置applicationContext-shiro.xml
RedisSessionDao.java<!-- 會話管理器 --> <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>
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; } }