问题描述
通过 redis 缓存 shiro 的 session,取值的时候 session id内容为 null。
java.lang.IllegalArgumentException: The org.apache.shiro.session.mgt.DelegatingSession implementation requires that the SessionKey argument returns a non-null sessionId to support the Session.getId() invocations.
原因分析
因为 shiro 的 Session 是一个 SimpleSession 类,其中属性用 transient 修饰,即不能被序列化。
RedisTemplate 默认使用JdkSerializationRedisSerializer,这个序列化模式会将value序列化成字节码,这样缓存shiro的session就没有什么问题。 但是一般都会用Fastjson、Jackson2Json来指定redis的序列化方式,这样的方式就会导致数据存取不一致问题。
解决
@Bean("redisTemplate") public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setValueSerializer(jacksonSeial); template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.afterPropertiesSet(); return template; }