如何定义SpringHttpSessionConfiguration中注入哪个CookieSerializer?

问题描述 投票:0回答:1

我有一个 Spring Boot 1.5 应用程序,我在 pom.xml 中添加了 Spring-Session。我正在实例化

CookieSerializer
类的 2 个实例,以满足我自己在配置类中的需要。

但是当应用程序启动时,我收到以下错误消息:

Parameter 0 of method setCookieSerializer in org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration required a single bean, but 2 were found:
    - authCookieSerializer: defined by method 'authCookieSerializer' in class path resource [nextgen/config/SpringHttpSessionConfig.class]
    - sessionCookieSerializer: defined in BeanDefinition defined in class path resource [nextgen/config/SpringHttpSessionConfig.class]

如果我还想将

CookieSerializer
bean 用于其他用途,我该如何使用 SpringSession?我是否被迫将
CookieSerializer
定义为
@Primary
bean 只是为了自动装配到 SpringSession 配置类中?

我的配置类:

@Configuration
public class SpringHttpSessionConfig {

    private Logger logger = LoggerFactory.getLogger(SpringHttpSessionConfig.class);

    @Bean(name="authCookieSerializer")
    public CookieSerializer authCookieSerializer() {
            DefaultCookieSerializer serializer = new DefaultCookieSerializer();
            serializer.setCookieName("auth"); 
            serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
            serializer.setCookiePath("/");
            return serializer;
    }

    @Bean(name="sessionClassicCookieSerializer")
    public CookieSerializer sessionCookieSerializer() {
            DefaultCookieSerializer serializer = new DefaultCookieSerializer();
            serializer.setCookieName("JSESSIONID"); 
            serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
            serializer.setCookiePath("/classic");
            return serializer;
    }

应用程序属性:

spring.session.store-type=hash-map

我遗漏了一些明显的东西吗?或者更确切地说,SpringSession 配置需要 CookieSerializer 的什么定义,以及如何在 Spring Session 配置 bean 不成为“主”bean 的情况下指定它?或者我别无选择,只能将“主要”CookieSerializer 定义为我想要注入到

SpringHttpSessionConfiguration
类中的那个?

spring spring-boot spring-session
1个回答
0
投票

我不确定这个答案是否是你的意思

我最近遇到了类似的问题,我的应用程序有 2 个登录页面,用于 2 个不同的用户类型,并且需要为这 2 个登录页面配置不同的会话 cookie 最大年龄。

我像你一样想到的一种方法是创建 2 个不同的 DefaultCookieSerializers 实例。然而,Spring似乎不允许这样做

幸运的是我找到了替代方案。

通过在 Spring Security 配置中注册您的自定义

AuthenticationSuccessHandler
,并在
onAuthenticationSuccess
方法中设置会话最大非活动间隔。

您可以在这里阅读更多信息:https://stackoverflow.com/a/57598611/5718493

© www.soinside.com 2019 - 2024. All rights reserved.