您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# SpringBoot项目怎么设置Session的过期时间
## 前言
在Web应用开发中,Session管理是用户身份认证和状态保持的核心机制之一。Spring Boot作为广泛使用的Java框架,提供了灵活的Session配置方式。本文将深入探讨5种设置Session过期时间的方法,并通过代码示例、原理分析和最佳实践帮助开发者掌握这一关键技术。
---
## 一、Session过期基础概念
### 1.1 什么是Session过期
Session过期是指当用户在一定时间内(默认30分钟)未与服务器交互时,服务器会自动销毁该用户的Session对象,强制用户重新登录。
### 1.2 过期时间的衡量标准
- **不活动间隔(Idle Timeout)**:从最后一次请求开始计算
- **绝对时间(Absolute Timeout)**:从Session创建开始计算
### 1.3 默认配置差异
- Tomcat默认:30分钟
- Jetty默认:30分钟
- Undertow默认:30分钟
---
## 二、配置文件设置法(推荐)
### 2.1 application.properties配置
```properties
# 设置60秒过期(单位:秒)
server.servlet.session.timeout=60
server:
servlet:
session:
timeout: 60s # 支持时间单位
ms
, s
, m
, h
, d
@Configuration
public class SessionConfig {
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.setSessionTimeout(Duration.ofMinutes(10));
return factory;
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
.sessionFixation().changeSessionId()
.maximumSessions(1)
.maxSessionsPreventsLogin(true)
.expiredUrl("/session-expired");
}
}
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
# Redis Session过期时间(默认1800秒)
spring.session.timeout=3600
spring.session.redis.flush-mode=on_save
@Bean
public RedisIndexedSessionRepository sessionRepository(
RedisOperations<String, Object> redisOperations) {
RedisIndexedSessionRepository repo = new RedisIndexedSessionRepository(redisOperations);
repo.setDefaultMaxInactiveInterval(Duration.ofHours(2).getSeconds());
return repo;
}
@PostMapping("/extend-session")
public String extendSession(HttpServletRequest request) {
request.getSession().setMaxInactiveInterval(30 * 60); // 30分钟
return "Session extended";
}
@Component
public class SessionTimeoutListener implements HttpSessionListener {
@Value("${custom.session.timeout}")
private int timeoutSeconds;
@Override
public void sessionCreated(HttpSessionEvent se) {
se.getSession().setMaxInactiveInterval(timeoutSeconds);
}
}
<!-- src/main/webapp/WEB-INF/web.xml -->
<session-config>
<session-timeout>15</session-timeout> <!-- 分钟 -->
</session-config>
@Bean
public UndertowServletWebServerFactory servletWebServerFactory() {
UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
factory.addDeploymentInfoCustomizers(deploymentInfo -> {
deploymentInfo.setDefaultSessionTimeout(20 * 60); // 20分钟
});
return factory;
}
问题1:设置不生效
- 检查是否有多个配置源冲突
- 确认是否使用了server.servlet.session.timeout
而非已废弃的server.session.timeout
问题2:集群环境不一致 - 确保所有节点配置相同 - 推荐使用集中式Session存储(Redis)
过期时间 | 内存占用 | 安全性 |
---|---|---|
短(5-15min) | 低 | 高 |
长(30min+) | 高 | 低 |
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
serializer.setCookieName("JSESSIONID");
serializer.setCookieMaxAge(3600); // 1小时
return serializer;
}
@EventListener
public void onSessionExpired(SessionExpiredEvent event) {
String sessionId = event.getSessionId();
log.warn("Session expired: {}", sessionId);
}
本文详细介绍了Spring Boot项目中设置Session过期时间的五种主要方式,涵盖了从基础配置到高级定制的全场景解决方案。在实际项目中,建议根据具体需求选择合适的方法,并特别注意分布式环境下的Session一致性保证。
最佳实践提示:在微服务架构中,建议完全采用无状态设计(JWT等),避免Session带来的扩展性问题。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。