web.xml 中的 session-timeout 和 max-age 有什么区别?

What is the difference between session-timeout and max-age in web.xml?

不知道我是否理解:

<session-config>
    <session-timeout>30</session-timeout> <!-- 30 minutes! -->
    <cookie-config>
        <http-only>true</http-only>
        <max-age>1800</max-age> <!-- 1800 seconds: 30 minutes! -->
    </cookie-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

此外,有什么方法可以配置 web.xml 中的所有 cookie?这似乎仅适用于会话 cookie。我需要过滤器才能使用此类功能吗?

<session-timeout> 是未使用会话的最大持续时间(从上次请求的时间算起)。当某个会话在这段时间内未被使用(无请求)时,服务器端应用程序会终止该会话(您可以捕获此事件并实现您自己的行为)。

会话 cookie max-age 定义此 cookie 在用户浏览器中存储的时间。

总而言之,当会话 cookie 达到其最大年龄时,会话将被迫断开连接。在另一种情况下,当会话因 session-timemout 事件断开连接时,会话 cookie 可能仍存在于用户浏览器中

为什么我们甚至需要这个?引用 Servlet 3.0 规范:

In the HTTP protocol, there is no explicit termination signal when a client is no longer active. This means that the only mechanism that can be used to indicate when a client is no longer active is a time out period.

web-commons 模式确实很好地解释了它:

The session-timeout element defines the default session timeout interval for all sessions created in this web application. The specified timeout must be expressed in a whole number of minutes.

If the timeout is 0 or less, the container ensures the default behaviour of sessions is never to time out. If this element is not specified, the container must set its default timeout period.


web-commons 模式也为我们提供了一些关于 max-age 元素的信息:

The lifetime (in seconds) that will be assigned to any session tracking cookies created by this web application. Default is -1


并回答你的最后一个问题:

Also, is there any way to configure ALL cookies in web.xml? This seems to apply to session cookies only. Do I need a filter for such feature?

我不这么认为。 恕我直言,最简单的™方法是子类化 HttpServletResponseWrapper 覆盖 addCookie() 方法。


总结一下:

  • session-timeout 配置 session 将在消耗服务器资源周围徘徊多长时间,即使在不活跃时也是如此已访问。

  • max-age 配置客户端浏览器保留 session cookie 的时间。此设置仅适用于 cookie 的生命周期:如果您使用 URL 重写,它不会做任何事情,它与多长时间完全无关会话保存在服务器端。默认值 -1,只要浏览器会话处于活动状态,就会保留 cookie


有用的链接:

Servlet 3.1 JSR-340 规范页面:
http://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html

网络共享 XSD 位于:
http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/web-common_3_0.xsd

在解释之前,他们一定要了解一些事情。

从你的问题可以看出,你已经知道第一项,但可能对下面列表中的第二项感到困惑:

  • 这两个设置使用不同的单位session-timeout分钟,而max-age
  • 他们以不同的方式测量时间session-timeout相对方式测量时间,max-age测量时间绝对方式的时间(在下面进一步解释)
  • 它们被不同的软件组件考虑并强制执行。 session-timeout 由容器考虑,而 max-age 由用户的浏览器考虑并强制执行。同样,您可以说 session-timeout 适用于服务器端,而 max-age 适用于客户端。

session-timeout 在容器决定销毁代表您的“连接”的 会话对象 之前给出最长 空闲持续时间服务器。这意味着您可以将 session-timeout 的值设置为仅 1 分钟,并且只要您的浏览器发送 HTTP GET,永远 仍然设法将会话对象保留在服务器中,POST等每59秒向服务器发送一次消息。

max-age 被用户的浏览器用来计算一个绝对的、固定的时间点,超过这个时间点 session cookieJSESSIONID in Java) 将不再发送到服务器。浏览器根据服务器向浏览器发送cookie的时间(加上max-age)来计算这个固定时间点。这是一个 绝对 固定时间点,超过该时间点将不再将 cookie 发送到服务器。因此,代表用户的 activity 或 inactivity 没有区别。这就是为什么如果您在浏览器的开发人员控制台中检查 cookie,您会看到会话 cookie 的绝对时间戳:


警告

上述关于 max-age 的值表示固定时间点的描述的一个例外是,如果使用特殊解释的值 -1。在这种情况下,您会在开发人员控制台中看到:

… 也如 中所述,这意味着浏览器将在“浏览器会话”期间继续发送 cookie。我将“浏览器会话”放在引号中以将其与服务器端会话区分开来。浏览器如何理解会话的概念(例如,不同的选项卡是否对应于不同的会话)是特定于实现的。

鉴于 session-timeoutmax-age 的不同语义,因此尝试“对齐”这两个值,如您在问题中提供的 web.xml 摘录:

<session-config>
    <session-timeout>30</session-timeout> <!-- 30 minutes! -->
    <cookie-config>
        <http-only>true</http-only>
        <max-age>1800</max-age> <!-- 1800 seconds: 30 minutes! -->
    </cookie-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

…可能表示混淆。

max-age 提供硬限制(除非使用特殊值 -1),而 session-timeout 实际上不提供限制,只要用户主动使用会话。话虽如此,我认为 max-age 的价值大于 session-timeout 而不是相反。

更有意义

关于默认值和特殊解释值(0 用于 session-timeout-1 用于 max-age)以及您是否可以为所有 cookie 配置这些值(如与会话 cookie 相对),这些要点在 .

中进行了解释