使用web.xml设置会话超时时间和使用setMaxInactiveInterval的区别

9

我是一名有用的助手,可以为您翻译文本。

我有一个需求,用户在认证进入会话后,如果10分钟没有任何操作,则会话超时。一旦会话超时,来自已过期会话的任何进一步请求都将被重定向到超时页面。我在这方面进行了研究,并得出了两种不同的方法。

方法 #1:

web.xml 中,我有以下代码...

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

方法 #2:

我在已认证页面内放置了以下代码...

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.

request.getSession().setMaxInactiveInterval(600);

现在我的问题是:
这两种方法有什么区别?哪一个更好或推荐?
同时,当使用第二种方法时,如果最终用户从经过身份验证的页面导航离开但未注销,则会话是否仍然在10分钟内无操作后超时?
2个回答

10

会话超时可以在不同的层面上设置:

  • 应用服务器中通常有默认设置,可以更改 - 这是所有应用程序的默认设置,或者针对特定应用程序(取决于服务器配置功能)。
  • 然后在应用程序描述符中 - 您可以通过使用web.xml来覆盖它 - 它将用于给定应用程序中的所有会话
  • 然后在应用程序代码中 - 您可以使用session.setMaxInactiveInterval()来覆盖它,它仅针对该会话进行覆盖

正如Roman所写的那样

无论如何设置,当超时到期时,容器都会使其失效。

您应该避免编程方法(最后一种),因为很容易忽略某些会话并获得默认超时时间,从而导致不一致的行为。如果想确保给定超时时间(业务要求)并且不想依赖服务器能力,请使用web.xml


感谢Roman和Gas的解释,让我了解了它们之间的区别,并且给了我一个很好的想法来选择哪种方法。我仍在等待完整的业务需求,以确定超时是否将在整个应用程序中保持一致,这将明确使用哪种方法。但是,非常感谢你们两位解释给我的帮助。由于我不能将两个答案都标记为我的问题的答案,因此我将Gas的解决方案标记为已接受的答案(没有特定原因),并投票支持Roman的答案。再次感谢。 - Sai
请注意,避免在代码中编程设置超时时间的建议并不适用于您的组织安全为不同用户指定了不同的超时时间的情况(例如,具有管理或其他提升访问权限的用户比“普通用户”具有更短的超时时间)。 - JackLThornton

7
第一种方法是在配置中使用静态常量来为所有会话设置。第二种方法是动态的,您可以在运行时使用servlet API设置值,并且仅影响调用了该方法的会话。一旦设置了值,无论使用哪种方法,容器都会使会话失效。请参见文档关于HttpSession#setMaxInactiveInterval(int)的说明:
指定客户端请求之间的时间(以秒为单位),在此时间内,Servlet容器将使此会话无效。
间隔值为零或更小表示会话永远不会超时。
部署描述符web.xml中的值为“分钟”,但setMaxInactiveInterval()方法接受“秒”中的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接