1. 概述

本教程将演示如何在 基于 Servlet 的 Web 应用中配置 Session 超时。对于有经验的开发者来说,Session 超时是 Web 开发中的基础概念,但配置细节容易踩坑,我们直接上干货。

2. 在 web.xml 中配置全局 Session 超时

所有 HTTP Session 的超时时间可以在 Web 应用的 web.xml 中统一配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>

    ...
    <session-config>
        <session-timeout>10</session-timeout>
    </session-config>

</web-app>

⚠️ 注意:超时值的单位是 分钟,不是秒!这个细节经常被忽略,导致实际超时时间比预期长得多。

一个有趣的冷知识:在 Servlet 3.0+ 环境中,虽然可以用注解替代 XML 部署描述符,但没有方法能通过编程方式设置全局 Session 超时。Servlet 规范 JIRA 上有相关开放问题,但至今未排期解决。

3. 编程方式设置单个 Session 超时

针对当前 Session 的超时时间,可以通过 javax.servlet.http.HttpSession API 动态设置:

HttpSession session = request.getSession();
session.setMaxInactiveInterval(10*60);

关键区别

  • XML 中的 <session-timeout> 单位是 分钟
  • setMaxInactiveInterval() 方法的单位是

这个方法适合需要动态调整超时时间的场景,比如根据用户权限设置不同超时策略。

4. Tomcat 的 Session 超时配置

所有 Tomcat 服务器都提供默认的 web.xml 文件,可用于全局配置整个 Web 服务器。该文件位于:

$tomcat_home/conf/web.xml

这个默认部署描述符已配置了 30 分钟的 <session-timeout>

覆盖规则

  • 单个应用在自身 web.xml 中配置的超时值会覆盖全局配置
  • 优先级顺序:应用级配置 > 全局配置

Jetty 也支持类似机制,配置文件位于:

$jetty_home/etc/webdefault.xml

5. 总结

本教程深入探讨了 Servlet Java 应用中配置 HTTP Session 超时的实用技巧,并展示了如何在 Tomcat 和 Jetty 等 Web 服务器级别进行设置。核心要点:

  1. ✅ 全局配置用 web.xml(单位:分钟)
  2. ✅ 动态配置用 setMaxInactiveInterval()(单位:秒)
  3. ⚠️ 应用级配置优先级高于服务器全局配置

完整示例代码可在 [GitHub 项目](https://github.com/eugenp/tutorials/tree/master/spring-web-modules/spring-mvc-xml "Example Project - web.xml with session timeout) 中获取。这是一个基于 Eclipse 的项目,可直接导入运行。

本地运行后,可通过以下地址访问首页:

http://localhost:8080/spring-mvc-xml/

原始标题:Java Session Timeout