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

标签 spring rest session redis spring-data-redis

在我的 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/

相关文章:

javascript - 通过 JS 设置的 Cookie 在浏览器关闭时过期未过期

php - 从第三方网站 POST 后丢失 session 数据

java - FileNotFoundException : class path resource [WEB-INF/dispatcher-servlet. xml] 无法打开,因为它确实存在但不存在

java - 使用 Jersey 获取 REST 资源作为 List<T>

java - Spring Web-Flow 不断用其执行参数替换获取请求参数

php - Laravel REST API - 无限循环

amazon-web-services - 如何将 AWS GO SDK 与 RESTful API 结合使用?

php - session 变量中的值随机更改,但不是所有实例

javascript - Spring thymeleaf 向 Controller 发送 javascript 对话框消息

spring - Struts2 和 Hibernate - 在 Servlet 外部访问 ActionContext.getContext().getSession()