gpt4 book ai didi

spring - 访问存储在 Redis 中的 Spring session 数据时出错

转载 作者:可可西里 更新时间:2023-11-01 11:24:46 26 4
gpt4 key购买 nike

在我的 REST Controller Spring 项目中,我想将 Session 信息存储在 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-idle=5

我还启用了 Http Redis session :

@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;
}
}

通过这种配置, session 信息存储在 Redis 中,但是,它被序列化得很奇怪。我的意思是,键是可读的,但存储的值不是(我从一个名为“Redis Desktop Manager”的程序查询信息)......例如......对于一个新 session ,我得到一个带有键的散列:

*spring:session:sessions:c1110241-0aed-4d40-9861-43553b3526cb*

这个散列包含的键是:maxInactiveInterval、lastAccessedTime、creationTime、sessionAttr:SPRING_SECURITY_CONTEXT但他们的值(value)观都是他们编码的,就像这样:

\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 从代码访问此信息,它会引发如下异常:

Exception occurred in target VM: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.StreamCorruptedException: invalid stream header: 73657373 org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.StreamCorruptedException: invalid stream header: 73657373 at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:82)

我认为这是 Spring session 信息的序列化/反序列化的某种问题,但我不知道还能做什么才能控制它。

谁知道我做错了什么?

谢谢

最佳答案

您走在正确的轨道上,您的问题确实是序列化。尝试此配置(仅使用这些序列化程序配置您的模板):

template.setHashValueSerializer(new JdkSerializationRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setKeySerializer(new StringRedisSerializer());
template.setDefaultSerializer(new JdkSerializationRedisSerializer());

关于spring - 访问存储在 Redis 中的 Spring session 数据时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49276849/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com