我不确定我是否明白:
<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。我是否需要过滤器才能使用此功能?
答案 0 :(得分:17)
为什么我们甚至需要这个?引用servlet 3规范:
在HTTP协议中,a时没有明确的终止信号 客户端不再有效。这意味着唯一的机制 可用于指示客户端何时不再处于活动状态的时间 外出时期。
web-commons架构确实在解释它:
session-timeout元素定义在此Web应用程序中创建的所有会话的默认会话超时间隔。指定的超时必须以整数分钟表示。
如果超时为0或更小,容器将确保会话的默认行为永远不会超时。 如果未指定此元素,则容器必须设置其默认值 超时期限。
web-commons架构也为我们提供了关于max-age的信息:
将分配给此Web应用程序创建的任何会话跟踪Cookie的生命周期(以秒为单位)。默认值为-1
总结一下:
会话超时可配置会话在消耗服务器资源方面的持续时间,即使未被主动访问也是如此。
max-age 配置客户端浏览器保留会话cookie的时间。此设置仅适用于cookie的生命周期:如果您正在使用URL重写,它将无法执行任何操作,并且它与在服务器端保留会话的时间完全无关。只要浏览器会话处于活动状态,默认值-1就会保留cookie。
Servlet 3.1 JSR页面: http://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html
web-commons xsd位于: http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/web-common_3_0.xsd
编辑过的问题:
另外,有没有办法在web.xml中配置所有cookie?这似乎 仅适用于会话cookie。我是否需要过滤器才能使用此功能?
我不这么认为。 最简单的方法IMHO将是子类 javax.servlet.http.HttpServletResponseWrapper重写addCookie()。
答案 1 :(得分:2)
在解释他们确实理解一些事情之前。从您的问题可以清楚地看出,您已经知道了第一个,但可能对下面列表中的第二个项目感到困惑:
session-timeout
以分钟为单位,而max-age
以秒为单位)session-timeout
以相对方式衡量时间,max-age
以绝对方式衡量时间(详见下文)session-timeout
,而用户的浏览器会考虑max-age
并强制执行session-timeout
。同样,您可以说max-age
适用于服务器端,而session-timeout
适用于客户端。 session-timeout
给出最大空闲持续时间。这意味着您可以将max-age
的值设置为仅1分钟,并且只要您的浏览器发送HTTP GET,POST等消息,您仍然可以将会话对象保留在服务器永远中。每59秒一次到服务器。
JSESSIONID
来计算绝对的,固定的时间点,超过该时间点,会话cookie(Java中的max-age
)将不再发送到服务器。这是绝对值,因此,代表用户的活动或不活动没有区别。这就是为什么如果你在浏览器的开发者控制台中检查cookie,你会看到会话cookie的绝对时间戳:
警告:上述关于-1
值表示固定时间点的描述的例外情况是,是否使用了特殊解释的值session-timeout
。在这种情况下,您在开发者控制台中看到的是:
...同样如this answer中所述,这意味着浏览器将在“浏览器会话”期间继续发送cookie。我将“浏览器会话”放在引号中以区别于服务器端会话。浏览器如何理解会话的概念(例如,不同的选项卡是否对应于不同的会话)是特定于实现的。
鉴于max-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
),而0
实际上没有限制,只要用户主动使用会话。
关于默认和特殊解释的值(session-timeout
的{{1}}和-1
的{{1}})以及是否可以为所有Cookie配置这些值(相对于只是会话cookie),这些点在this answer中解释。
答案 2 :(得分:1)
<session-timeout>
是未使用会话的最长持续时间(从上次请求开始)。当一段时间没有使用会话(没有请求)时,服务器端应用程序会终止会话(您可以捕获此事件并实现自己的行为)。
会话cookie max-age
定义此cookie存储在用户浏览器中的时间。
要结束,当会话cookie达到其最大年龄时,会话被强制断开连接。在另一种情况下,当会话被session-timemout
事件断开时,会话cookie可能仍然存在于用户浏览器中