緊接上篇鏈接html
在多臺tomcat集羣中,shiro管理的session須要放在Redis中,咱們只須要增長redisSessionDAO的配置就行web
<!-- 定義會話管理器的操做 表示當前web開發中的session的處理操做都由shiro操做控制 --> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <!-- 定義Session能夠進行序列化的工具類 --> <property name="sessionDAO" ref="redisSessionDAO" /> <property name="sessionIdUrlRewritingEnabled" value="false" /> </bean>
public class RedisSessionDAO extends EnterpriseCacheSessionDAO { public static final String prefix = "shrio_redis:"; @Resource private RedisTemplate<String, Object> redisTempate; // 要提供有Redis處理工具類 @Override protected Serializable doCreate(Session session) { // 建立Session,返回session id Serializable sessionId = super.doCreate(session); // 建立sessionid // 將當前建立好的Session的數據保存在Redis數據庫裏面 this.redisTempate.opsForValue().set(prefix+sessionId.toString(), session,6000); return sessionId; } @Override protected Session doReadSession(Serializable sessionId) { // 根據session Session session = (Session) redisTempate.opsForValue().get(prefix+sessionId.toString());// id讀取session數據 return session; } @Override protected void doUpdate(Session session) { // 實現Session更新,每次操做都要更新 super.doUpdate(session); if (session != null) { this.redisTempate.opsForValue().set(prefix+session.getId().toString(),session, 1800); } } @Override protected void doDelete(Session session) { // session的刪除處理 super.doDelete(session); this.redisTempate.delete(prefix+session.getId().toString()); } }
上面代碼中使用到了redisTemplate,可是redisTemplate默認的序列化方式有缺點,再此咱們重新指定序列化方式。redis
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="jedisConnectionFactory" /> <property name="keySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" /> </property> </bean>