在应用程序开发中,我们的应用程序是以cas-client角色加入到统一认证体系中来的,需要添加以下依赖。
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
</dependency>
1.spring-session管理cas session
cas-client的session由spring-session进行管理,需要加入以下依赖:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency>
Spring session的配置在spring-boot-autoconfigure模块的org.springframework.boot.autoconfigure.session.SessionProperties类中,以“spring.session”,主要是定义session共享的策略,比如通过redis进行共享。
2.redis对session进行管理
如果Session在redis中进行共享,则需把spring.session.store-type配置为redis,同时在应用程序中添加以下依赖:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
spring-session-data-redis依赖的加入已经带入了spring-session-core依赖,所以spring-session-core无需显式添加依赖。
redis的配置在spring-boot-autoconfigure模块的org.springframework.boot.autoconfigure.data.redis.RedisProperties类中。
redis client的配置在org.springframework.boot.autoconfigure.data.redis.LettuceConnectionConfiguration或org.springframework.boot.autoconfigure.data.redis.JedisConnectionConfiguration,表示支持两种不同的客户端。
org.springframework.session.web.http.SessionRepositoryFilter的doFilterInternal方法中,最后会通过sessionRepository进来保存session。而sessionRepository正是org.springframework.session.data.redis.RedisSessionRepository类的实例。
3.Redis中session数据乱码问题
在初始化RedisTemplate时,会设置对应的serializer,这个决定了保存在redis中key和value的序列化格式,默认是使用ISO_8859_1编码的,所以直接在redis中查看的话,会出现乱码。
原因主要是:spring-data-redis 的 RedisTemplate<K, V>模板类 在操作redis时默认使用JdkSerializationRedisSerializer 来进行序列化。spring操作redis是在jedis客户端基础上进行的,而jedis客户端与redis交互的时候协议中定义是用byte类型交互,看到spring-data-redis中RedisTemplate<K, V>在操作的时候k,v是泛型对象,而不是byte[]类型的,这样导致的一个问题就是,如果不对RedisTemplate进行设置,spring会默认采用defaultSerializer = new JdkSerializationRedisSerializer();这个方法来对key、value进行序列化操作,JdkSerializationRedisSerializer它使用的编码是ISO-8859-1。
如果要看到明文的session数据,解决方案有多种:
(1)使用 StringRedisTemplate 而不是使用 RedisTemplate;
(2)使用RedisTemplate,则需要设置对应的序列化器为StringRedisSerializer;
(3)使用RedisTemplate是,规定范型为<String, String>。
这样,就可以看到可打印字符了。