springboot项目怎么设置session的过期时间

发布时间:2022-01-27 10:54:15 作者:kk
来源:亿速云 阅读:1842
# 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

2.2 application.yml配置

server:
  servlet:
    session:
      timeout: 60s  # 支持时间单位

2.3 注意事项

  1. 最小值限制:不同容器有不同下限(Tomcat最低60秒)
  2. 单位说明:
    • 纯数字:默认为秒
    • 带单位:支持ms, s, m, h, d

三、Java代码配置法

3.1 Servlet容器自定义

@Configuration
public class SessionConfig {
    
    @Bean
    public ConfigurableServletWebServerFactory webServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.setSessionTimeout(Duration.ofMinutes(10));
        return factory;
    }
}

3.2 Spring Security专用配置

@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");
    }
}

四、Redis Session存储配置

4.1 引入依赖

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

4.2 配置过期时间

# Redis Session过期时间(默认1800秒)
spring.session.timeout=3600
spring.session.redis.flush-mode=on_save

4.3 自定义Redis配置

@Bean
public RedisIndexedSessionRepository sessionRepository(
    RedisOperations<String, Object> redisOperations) {
    RedisIndexedSessionRepository repo = new RedisIndexedSessionRepository(redisOperations);
    repo.setDefaultMaxInactiveInterval(Duration.ofHours(2).getSeconds());
    return repo;
}

五、编程式动态设置

5.1 控制器中动态修改

@PostMapping("/extend-session")
public String extendSession(HttpServletRequest request) {
    request.getSession().setMaxInactiveInterval(30 * 60); // 30分钟
    return "Session extended";
}

5.2 监听器实现

@Component
public class SessionTimeoutListener implements HttpSessionListener {
    
    @Value("${custom.session.timeout}")
    private int timeoutSeconds;

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        se.getSession().setMaxInactiveInterval(timeoutSeconds);
    }
}

六、容器特定配置

6.1 Tomcat专用配置

<!-- src/main/webapp/WEB-INF/web.xml -->
<session-config>
    <session-timeout>15</session-timeout> <!-- 分钟 -->
</session-config>

6.2 Undertow配置

@Bean
public UndertowServletWebServerFactory servletWebServerFactory() {
    UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
    factory.addDeploymentInfoCustomizers(deploymentInfo -> {
        deploymentInfo.setDefaultSessionTimeout(20 * 60); // 20分钟
    });
    return factory;
}

七、最佳实践与疑难解答

7.1 推荐方案组合

  1. 生产环境:Redis存储 + 配置文件设置
  2. 开发环境:本地Session + 动态设置

7.2 常见问题排查

问题1:设置不生效 - 检查是否有多个配置源冲突 - 确认是否使用了server.servlet.session.timeout而非已废弃的server.session.timeout

问题2:集群环境不一致 - 确保所有节点配置相同 - 推荐使用集中式Session存储(Redis)

7.3 性能考量

过期时间 内存占用 安全性
短(5-15min)
长(30min+)

八、扩展知识

8.1 Cookie Max-Age关联

@Bean
public CookieSerializer cookieSerializer() {
    DefaultCookieSerializer serializer = new DefaultCookieSerializer();
    serializer.setCookieName("JSESSIONID");
    serializer.setCookieMaxAge(3600); // 1小时
    return serializer;
}

8.2 Spring Session事件监听

@EventListener
public void onSessionExpired(SessionExpiredEvent event) {
    String sessionId = event.getSessionId();
    log.warn("Session expired: {}", sessionId);
}

结语

本文详细介绍了Spring Boot项目中设置Session过期时间的五种主要方式,涵盖了从基础配置到高级定制的全场景解决方案。在实际项目中,建议根据具体需求选择合适的方法,并特别注意分布式环境下的Session一致性保证。

最佳实践提示:在微服务架构中,建议完全采用无状态设计(JWT等),避免Session带来的扩展性问题。 “`

推荐阅读:
  1. php中session过期时间的设置方法
  2. php设置session过期时间的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot session

上一篇:linux中怎么制作PHP的RPM包

下一篇:Linux系统怎么格式化USB设备

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》