问题引入

紧接上篇连接

在多台tomcat集群中,shiro管理的session需要放在Redis中,我们只需要增加redisSessionDAO的配置就行

    <!-- 定义会话管理器的操作  表示当前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>

sessionDao的实现

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,但是redisTemplate默认的序列化方式有缺点,再此我们从新指定序列化方式。

   <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>
04-15 08:27