Spring会话无法将会话保存到Redis [英] Spring session unable save session to Redis

查看:42
本文介绍了Spring会话无法将会话保存到Redis的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个与 Spring Security 集成的应用程序.我将此应用程序分成两个应用程序,为此我想使用 Redis 配置 spring 会话,以便在这两个应用程序之间进行集中身份验证.我已经配置了 Redis,但是当我想登录时出现以下异常:

I have an application that is integrated with spring security. I separated this application to two app for this I want to config spring session with Redis for centralization authentication between this two app. I have configured Redis but when I want to log in the below exception is raised:

原因:org.springframework.core.serializer.support.SerializationFailedException:使用 DefaultSerializer 序列化对象失败;嵌套异常是 java.io.NotSerializableException:org.springframework.dao.support.PersistenceExceptionTranslationInterceptor在org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:68)~[spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE] 在org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:35)~[spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE] 在org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:90)~[spring-data-redis-1.7.2.RELEASE.jar:na] ... 35个常用帧省略引起:java.io.NotSerializableException:org.springframework.dao.support.PersistenceExceptionTranslationInterceptor在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) ~[na:1.8.0_111]在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) ~[na:1.8.0_111]

Caused by: org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.io.NotSerializableException: org.springframework.dao.support.PersistenceExceptionTranslationInterceptor at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:68) ~[spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:35) ~[spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:90) ~[spring-data-redis-1.7.2.RELEASE.jar:na] ... 35 common frames omitted Caused by: java.io.NotSerializableException: org.springframework.dao.support.PersistenceExceptionTranslationInterceptor at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) ~[na:1.8.0_111] at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) ~[na:1.8.0_111]

RedisConfig:

The RedisConfig:

@Configuration
@EnableRedisHttpSession
public class RedisConfig implements BeanClassLoaderAware {

    private ClassLoader loader;

    @Bean
    @Primary
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
        redisTemplate.setConnectionFactory(cf);
        redisTemplate.setKeySerializer(redisTemplate.getStringSerializer());
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));
        return redisTemplate;
    }

    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("JSESSIONID"); // <1>
        serializer.setCookiePath("/"); // <2>
        serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$"); // <3>
        return serializer;
    }

    @Bean
    public HttpSessionStrategy httpSessionStrategy() {
        return new HeaderHttpSessionStrategy();
    }

    @Bean
    public LettuceConnectionFactory connectionFactory() {
        return new LettuceConnectionFactory();
    }

    ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModules(SecurityJackson2Modules.getModules(this.loader));
        return mapper;
    }

    public void setBeanClassLoader(ClassLoader classLoader) {
        this.loader = classLoader;
    }
}

和这个配置:

public class SafeDeserializationRepository<S extends ExpiringSession> implements SessionRepository<S> {

    private final SessionRepository<S> delegate;
    private final RedisTemplate<Object, Object> redisTemplate;

    private static final String BOUNDED_HASH_KEY_PREFIX = "spring:session:sessions:";
    // private static final Logger logger =
    // getLogger(SafeDeserializationRepository.class);

    public SafeDeserializationRepository(SessionRepository<S> delegate, RedisTemplate<Object, Object> redisTemplate) {
        this.delegate = delegate;
        this.redisTemplate = redisTemplate;
    }

    @Override
    public S createSession() {
        return delegate.createSession();
    }

    @Override
    public void save(S session) {
        delegate.save(session);
    }

    @Override
    public S getSession(String id) {
        try {
            return delegate.getSession(id);
        } catch (SerializationException e) {
            // logger.info("Deleting non-deserializable session with key {}",
            // id);
            redisTemplate.delete(BOUNDED_HASH_KEY_PREFIX + id);
            return null;
        }
    }

    @Override
    public void delete(String id) {
        delegate.delete(id);
    }
}

和RedisSessionConfig:

and RedisSessionConfig:

@Configuration
public class RedisSessionConfig extends RedisHttpSessionConfiguration {
  @Autowired
  RedisTemplate<Object, Object> redisTemplate;

  @Bean
  @Override
  public <S extends ExpiringSession> SessionRepositoryFilter<? extends ExpiringSession> springSessionRepositoryFilter(SessionRepository<S> sessionRepository) {
    return super.springSessionRepositoryFilter(new SafeDeserializationRepository<>(sessionRepository, redisTemplate));
  }
}

怎么了?

我很困惑

感谢您的帮助.

推荐答案

几周前我遇到了类似的问题.请检查课程.您可以将 java 的 implements Serializable 用于这些类.当类不可序列化时会遇到此问题.还可以查看 Jackson 注释,以便您可以选择对象的序列化方式.

I ran in to a similar issue few weeks ago.Please check the classes. You can use the java's implements Serializable for those classes. The issue is encountered when the class is not Serializable. Also look in the Jackson annotations so that you can choose how object will be serialized.

这篇关于Spring会话无法将会话保存到Redis的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆