spring-security - session 范围内的 Spring session + Redis + Infinispan 缓存失败

标签 spring-security spring-boot redis microservices infinispan

我使用 Infinispan 缓存作为 session 范围的 bean 来缓存 Spring MVC 应用程序中的用户相关数据对象。

现在我们迁移到spring boot,我们想使用@enableRedisHttpSession 但是我们面临的问题是附加到 session 的 Infinispan CacheManager 不是可序列化的,从而产生以下异常:

java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [org.infinispan.spring.provider.SpringEmbeddedCacheManagerFactoryBean]
    org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:43)
    org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:63)
    org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:35)
    org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:50)
    org.springframework.data.redis.core.AbstractOperations.rawHashValue(AbstractOperations.java:166)
    org.springframework.data.redis.core.DefaultHashOperations.putAll(DefaultHashOperations.java:128)
    org.springframework.data.redis.core.DefaultBoundHashOperations.putAll(DefaultBoundHashOperations.java:85)
    org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.saveDelta(RedisOperationsSessionRepository.java:409)
    org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.access$000(RedisOperationsSessionRepository.java:331)
    org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:211)
    org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:141)
    org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:193)
    org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.access$100(SessionRepositoryFilter.java:169)
    org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:127)
    org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:65)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:103)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

通常我们会将用户请求平衡到多个节点,因此我们需要在节点之间共享缓存(使用 Redis 存储)。

谁能帮忙。

最佳答案

显然缓存管理器不可序列化,因为它不应该被序列化——它不是数据。您必须跟踪引用 SpringEmbeddedCacheManagerFactoryBean 的字段并使其成为 transient 。

关于spring-security - session 范围内的 Spring session + Redis + Infinispan 缓存失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37632735/

相关文章:

spring-security - 使用正确的访问 token 访问 OAuth2 secret 资源时遇到问题

kubernetes - Bitnami Redis 在 Kubernetes 身份验证失败时使用现有 key

java - Spring Security中的用户名密码认证

grails - Grails Spring Security:如何允许密码为空?

java - IntelliJ 中的 Spring 项目中的 gradle 存在 java 版本控制问题

angular - HTTP 心跳以避免长时间运行的 http 调用的连接断开

python - 在 flask 中开始 celery : AttributeError: 'Flask' object has no attribute 'user_options'

php - 如何使用类函数和初始化文件获取redis键值

grails - 如何禁止在grails中访问 View 或 Controller

java - Spring Boot Jersey 静态内容,资源位于 "/"