访问存储在Redis中的Spring会话数据时出错
在我的REST控制器Spring项目中,我想在Redis中存储会话信息 在我的application.properties中,我定义了以下内容:访问存储在Redis中的Spring会话数据时出错,spring,rest,session,redis,spring-data-redis,Spring,Rest,Session,Redis,Spring Data Redis,在我的REST控制器Spring项目中,我想在Redis中存储会话信息 在我的application.properties中,我定义了以下内容: spring.session.store-type=redis spring.session.redis.namespace=rdrestcore com.xyz.redis.host=192.168.201.46 com.xyz.redis.db=0 com.xyz.redis.port=6379 com.xyz.redis.pool.min-id
spring.session.store-type=redis
spring.session.redis.namespace=rdrestcore
com.xyz.redis.host=192.168.201.46
com.xyz.redis.db=0
com.xyz.redis.port=6379
com.xyz.redis.pool.min-idle=5
我还通过以下方式启用了Http Redis会话:
@Configuration
@EnableRedisHttpSession
public class SessionConfig extends AbstractHttpSessionApplicationInitializer
{}
我终于有了这样一个redis连接工厂:
@Configuration
@EnableRedisRepositories
public class RdRedisConnectionFactory {
@Autowired
private Environment env;
@Value("${com.xyz.redis.host}")
private String redisHost;
@Value("${com.xyz.redis.db}")
private Integer redisDb;
@Value("${com.xyz.redis.port}")
private Integer redisPort;
@Value("${com.xyz.redis.pool.min-idle}")
private Integer redisPoolMinIdle;
@Bean
JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
if(redisPoolMinIdle!=null) poolConfig.setMinIdle(redisPoolMinIdle);
return poolConfig;
}
@Bean
JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory jedisConFactory = new JedisConnectionFactory();
if(redisHost!=null) jedisConFactory.setHostName(redisHost);
if(redisPort!=null) jedisConFactory.setPort(redisPort);
if(redisDb!=null) jedisConFactory.setDatabase(redisDb);
jedisConFactory.setPoolConfig(jedisPoolConfig());
return jedisConFactory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
final RedisTemplate< String, Object > template = new RedisTemplate();
template.setConnectionFactory( jedisConnectionFactorySpring());
template.setKeySerializer( new StringRedisSerializer() );
template.setValueSerializer( new GenericJackson2JsonRedisSerializer() );
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer( new GenericJackson2JsonRedisSerializer() );
return template;
}
}
这个散列包含的键是:maxInactiveInterval、lastAccessedTime、creationTime、SessionAtr:SPRING\u SECURITY\u CONTEXT
但它们的值都是这样编码的:
\xAC\xED\x00\x05sr\x00\x0Ejava.lang.Long\x8B\xE4\x90\xCC\x8F\xDF\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xAC\x95\x1D\x0B\x94\xE0\x8B\x02\x00\x00xp\x00\x00\x01b$G\x88*
(用于creationTime键)
如果我试图通过redisTemplate从代码中访问此信息,则会出现如下异常:
目标VM中发生异常:无法反序列化;嵌套异常是
org.springframework.core.serializer.support.SerializationFailedException:
未能反序列化有效负载。字节数组是
DefaultDeserializer?的相应序列化?;嵌套异常
is java.io.StreamCorruptedException:无效流头:73657373
org.springframework.data.redis.serializer.SerializationException:无法反序列化;嵌套异常是
org.springframework.core.serializer.support.SerializationFailedException:
未能反序列化有效负载。字节数组是
DefaultDeserializer?的相应序列化?;嵌套异常
is java.io.StreamCorruptedException:无效流头:73657373
位于org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:82)
我认为Spring会话信息的序列化/反序列化存在某种问题,但我不知道还能做些什么来控制它
有人知道我做错了什么吗
谢谢你你走对了方向,你的问题确实是。尝试此配置(仅使用这些序列化程序配置模板):
问题解决了吗?没有,我终于停止了访问Spring存储的会话信息的尝试
*spring:session:sessions:c1110241-0aed-4d40-9861-43553b3526cb*
template.setHashValueSerializer(new JdkSerializationRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setKeySerializer(new StringRedisSerializer());
template.setDefaultSerializer(new JdkSerializationRedisSerializer());