spring boot redis会话无法在浏览器重新启动后继续运行

ttygqcqt  于 2021-06-10  发布在  Redis
关注(0)|答案(0)|浏览(257)

我使用redis作为springboot应用程序(2.1.7)的会话存储(在docker容器中运行)。在application.properties中,这些记录是:

spring.session.store-type=redis
server.servlet.session.timeout=7d
spring.session.redis.flush-mode=on_save
spring.session.redis.namespace=spring:session
spring.redis.host=localhost
spring.redis.port=6379
server.servlet.session.cookie.secure=true
server.servlet.session.cookie.http-only=true

redis正在“工作”。因此有功能会话存储。但问题是cookie上的会话到期时间是这样的:

如果我关闭浏览器并重新打开选项卡,我将不会被记录(并且我有一个新的会话标识符)。如果我是以用户身份登录、以管理员身份登录(下面列出的一些侦听器以不同的方式处理到期时间)或以访客身份登录(不是登录用户),则不会产生任何影响。每次重新启动浏览器时,都会有一个新的会话标识符。
通常会话的“ttl”是7天(如属性文件中所述),但是对于管理员用户,时间被压缩为1小时

if (authentication.getPrincipal() instanceof LoggedInPersonDetails) {
        LoggedInPersonDetails loggedInPersonDetails = (LoggedInPersonDetails) authentication.getPrincipal();
        loggedInPersonDetails.getAuthorities().stream()
                .filter(authority -> !Authority.WEB_ENTER.getName().equals(authority.getAuthority()))
                .findAny()
                .ifPresent(authority ->
                        session.setMaxInactiveInterval((int) nonStandardUserSessionTimeout.getSeconds()));
    }

pom.xml中的依赖项

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

这些似乎都不管用。我从“经典”(非redis)spring引导会话处理切换到behav的预期状态。所以spring引导到redis的配置中肯定有一些错误。
编辑:我试图添加

server.servlet.session.cookie.max-age=7d

但它似乎不起作用。cookie的到期时间仍设置为会话
编辑2:我´我已经知道如何设置cookie的过期时间了´在我的mvc配置中注册defaultcookieserializer bean,并将maxage属性设置为某个值。

@Bean
public CookieSerializer defaultCookieSerializer() {
    DefaultCookieSerializer serializer = new DefaultCookieSerializer();
    serializer.setCookieMaxAge(60 * 60 * 24 * 7);

    return serializer;
}

但是一个新的问题出现了。cookie过期日期未更新,因为我在web上处于活动状态。例如,当expiry date设置为12:00并且我在11:58重新加载页面时,cookie的到期日期应该更新为now()+default maxage。
我找到了一些实现自定义拦截器的解决方案,但对我来说,这似乎不是一个正确的解决方案。spring会话真的没有一些功能来实现这一点吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题