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

时间:2014-10-03 16:52:07

标签: java jsp session

我要求用户在会话中进行身份验证,并且在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);

现在我的问题是这两种方法有什么区别?哪一个更好还是推荐?而且当使用方法#2时,如果最终用户导航离开经过身份验证的页面但尚未注销,会话在10分钟不活动后仍会超时吗?

2 个答案:

答案 0 :(得分:4)

可以在各个级别设置会话超时:

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

正如Roman所写,无论你如何设置它,当超时到期时,容器会使它失效。

您应该避免使用编程方法(最后一个),因为很容易错过某个会话并且它将获得默认超时,并且您将具有不一致的行为。如果要确保给定超时(业务要求)并且不希望依赖服务器功能,请使用web.xml。

答案 1 :(得分:3)

第一种方法是在配置中为所有会话使用静态常量。第二种方法是动态的,您可以在运行时动态地使用servlet API设置值,并仅影响调用该方法的会话。设置该值后,无论使用哪种方法,容器都会使会话失效。请参阅文档中有关HttpSession#setMaxInactiveInterval(int)的内容:

  

指定servlet容器使此会话无效之前的客户端请求之间的时间(以秒为单位)。

     

间隔值为零或更小表示会话永远不会超时。

部署描述符web.xml中的值以“分钟”为单位,但setMaxInactiveInterval()方法接受“秒”中的值。