我使用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会话真的没有一些功能来实现这一点吗?
暂无答案!
目前还没有任何答案,快来回答吧!