会话共享
Session共享
- Blog项目采用的是Shiro+Redis实现Session共享
- 因为Shiro中本身就提供了sessionManager和sessionDAO,我们可以把shiro和redis集成起来,把session缓存到Redis中,然后需要使用的时候从Redis中获取对应的session
Session共享思路
会话共享的实现思路其实就是
1.配置Redis连接信息并在启动类上开启缓存
2.自定义Redis的配置类RedisConfig继承CachingConfigurerSupport拿到RedisTemplate并能序列化
3.自定义RedisSessionDao类实现AbstractSessionDAO重写方法实现RedisTemplate对Session的操作,同时用来构造sessionManager会话管理器websessionMananger
4.自定义RedisCacheManager实现CacheManager接口作为CacheManager缓存管理器(作用是拿到Cache)
5.由(自定义)Realm,会话管理器,缓存管理器构建安全管理器securityManager实例
最重要的就是4.5两步骤,构建缓存管理器实例再构建会话管理器实例,再将Realm和两个管理器一起构建安全管理器实例,配置完成后登录,可以再Redis看到对应的Key证明缓存已经交给Redis
集成Redis
集成单机版的Redis(后续可扩展成为集群)
配置application.properties
#cache指定缓存类型
spring.cache.type=REDIS
#data-redis
spring.redis.database=15
spring.redis.host=192.168.**.**
spring.redis.password=
spring.redis.port=6379
spring.redis.timeout=2000
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.max-wait=-1
spring.redis.jedis.pool.min-idle=0
#spring.redis.sentinel.master=mymaster
#spring.redis.sentinel.nodes=192.168.210.**\:26379
redis.proxyIpDBNum=15
#设置的session和授权等信息的过期时间
#session share unit hours(设置成分钟方便测试)
session.timeout=3
#cacheTimeOut unit hours
cache.timeout=12
Application开启缓存
@SpringBootApplication
@EnableCaching //开启缓存
public class OneserviceManagerApplication {
public static void main(String[] args) {
SpringApplication.run(OneserviceManagerApplication.class, args);
}
}
编写RedisConfig.java配置类
-
RedisConfig是自定义的Redis配置类继承CachingConfigurerSupport,
-
该类的主要作用就是拿到 RedisTemplate处理Redis数据并进行最佳序列化
package com.ch.oneservice.manager.config.redis; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig extends CachingConfigurerSupport { @Autowired private RedisConnectionFactory redisConnectionFactory; /** * 获取RedisTemplate对象,处理Redis数据,并且进行最佳序列化 * @return */ @Bean(name="redisTemplate") public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> template = new RedisTemplate<>(); //手动序列化 JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer(); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); template.setKeySerializer(stringRedisSerializer); template.setValueSerializer(jdkSerializationRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); template.setHashValueSerializer(jdkSerializationRedisSerializer); //连接Redis //jedisConnectionFactory.setDatabase(6); template.setConnectionFactory(redisConnectionFactory); template.afterPropertiesSet(); return template; } }
Redis实现shiro的session共享
RedisSessionDao的自定义实现
(session的缓存处理)
-自定义 RedisSessionDao继承AbstractSessionDAO,重写对Session操作的API实现Redis对Session的操作,包括存储删除创建Session
package com.ch.evaluation.auth.shiro.cas;