当前位置: 首页 > 知识库问答 >
问题:

访问存储在Redis中的Spring会话数据时出错

百里俭
2023-03-14

在我的REST controllers 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-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;
    }
}
*spring:session:sessions:c1110241-0aed-4d40-9861-43553b3526cb*

\xac\xx\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从代码中访问这些信息,它会产生一个类似这样的异常

目标虚拟机中发生异常:无法反序列化;嵌套异常为org.springframework.core.serializer.support.serializationfailedexception:反序列化有效负载失败。字节数组是DefaultDeserializer相应序列化的结果吗?;嵌套异常为java.io.StreamCorruptedException:无效的流头:73657373 org.SpringFramework.Data.Redis.Serializer.SerializationException:无法反序列化;嵌套异常为org.springframework.core.serializer.support.serializationfailedexception:反序列化有效负载失败。字节数组是DefaultDeserializer相应序列化的结果吗?;嵌套异常为java.io.StreamcorruptedException:org.springframework.data.redis.serializer.jdkserializationredisserializer.deserialize(jdkserializationredisserializer.java:82)处的流头:73657373无效

我认为Spring会话信息的序列化/反序列化存在某种问题,但我不知道还可以做什么来控制它。

有人知道我做错了什么吗?

谢谢你

共有1个答案

庞意智
2023-03-14

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

template.setHashValueSerializer(new JdkSerializationRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setKeySerializer(new StringRedisSerializer());
template.setDefaultSerializer(new JdkSerializationRedisSerializer());
 类似资料:
  • 我有一个微服务架构中的spring网关。 当请求到达网关时,它必须以下面提到的方式进行操作 创建会话并设置属性 在redis中保存会话 将请求路由到Microservice B Microservice B接收会话ID并从会话获取属性 在尝试实现这一点时,(第2点)保存会话ID的操作发生在调用microservices B并返回其响应(第4点)之后。(即第2点发生在第4点之后)。 但是,在请求被路

  • 在应用程序中创建了会话 在Redis CLI中运行“keys*”命令,看到一个新条目(如“spring:session:sessions:6b55103a-baf5-4a05-a127-3a9cfa15c164”) 从应用程序中向会话添加自定义bean 在Redis CLI中运行“keys*”命令,并看到该bean的另一个新条目(如“\xac\xed\x00\x05t\x00\tcustomer1

  • 问题内容: 我在整个互联网上进行搜索,但是找不到答案有明确的解决方案。 我在Java中使用Selenium Webdriver。 我的测试需要验证何时保存登录信息,然后关闭浏览器并重新打开,然后这些凭据仍然保留并保存在新会话中。因此,我想关闭当前会话并重新打开它,以验证cookie是否仍保留在页面上,但是Selenium删除了所有存储的会话数据,因此测试用例将始终失败。在针对特定测试用例关闭浏览器

  • 问题内容: 我在整个互联网上进行搜索,但是找不到答案有明确的解决方案。 我在Java中使用Selenium Webdriver。 我的测试需要验证何时保存登录信息并关闭浏览器并重新打开,然后这些凭据仍然保留并保存在新会话中。因此,我想关闭当前会话并重新打开它,以验证cookie是否仍保留在页面上,但是Selenium删除了所有存储的会话数据,因此测试用例将始终失败。关闭特定测试用例的浏览器后,是否

  • 当我运行它时,我得到一个no this session错误。

  • 问题内容: 我正在尝试在我的Express应用程序中使用redis进行会话。 我执行以下操作: 稍后,在我的应用程序中,如果执行以下操作: 我得到: 无法读取未定义的属性“ someProperty” 这表明req.session是未定义的 (我可以从config部分的console.log条目中看到) 我肯定有redis运行,并且可以看到我的应用最初连接到它(使用redis-cli监视器) 问题