【问题标题】:How Do I Keep HttpSessions Alive in Tomcat?如何在 Tomcat 中保持 HttpSessions 处于活动状态?
【发布时间】:2011-04-04 12:59:29
【问题描述】:
我在 Tomcat 服务的 Web 应用程序中遇到了会话超时问题。通过阅读 Tomcat 的文档,会话在可以在 web.xml 文件中配置的时间后过期。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
问题)这是否意味着从为用户创建会话起 30 分钟?还是从上次访问会话起 30 分钟?
如果按照我最初的想法,距离上次访问会话 30 分钟,我似乎没有看到这种行为。当我使用该网站时,我的会话似乎丢失了。除了这一设置之外,还有其他方法可以配置会话行为吗?我有什么遗漏吗?
Apache Tomcat/6.0.20
【问题讨论】:
标签:
session
tomcat
servlets
tomcat6
httpsession
【解决方案1】:
当网络浏览器连接到您的应用程序时,它会启动一个会话。最长不活动时间(30 分钟)过后,Tomcat 将关闭服务器上的会话。
只要网络浏览器上有活动,例如刷新当前页面或浏览应用程序控制下的其他页面,就会重置此超时。仅仅保持浏览器窗口打开不会使会话保持打开状态,因为它不会在浏览器上生成任何活动。
您可以按照您的描述在 web.xml 文件中进行设置。
您也可以通过调用setMaxInactiveInterval(int interval) 为session 对象设置它
这指定了在 servlet 容器使该会话无效之前客户端请求之间的时间(以秒为单位)。
您必须确保 cookies 已为您的浏览器启用。否则,您会为每个请求创建一个新会话。您应该为应用程序中的每个 URL 调用 HttpServletResponse.encodeURL(String url)。来自 api 文档:
"通过在其中包含会话 ID 对指定的 URL 进行编码,或者,如果不需要编码,则返回原样的 URL。该方法的实现包括确定是否需要对会话 ID 进行编码的逻辑在 URL 中。例如,如果浏览器支持 cookie,或者关闭会话跟踪,则不需要 URL 编码。
为了强大的会话跟踪,servlet 发出的所有 URL 都应通过此方法运行。否则,不支持 cookie 的浏览器无法使用 URL 重写。”