2014-10-03 109 views
1

我有一个要求,其中用户通过身份验证进入会话,并且在非活动状态10分钟后,会话超时。一旦会话超时,现在过期的会话中的任何进一步请求都会重定向到超时页面。我在这方面进行了研究,并采用了两种不同的方法。使用web.xml和setMaxInactiveInterval设置会话超时之间的区别

方法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); 

现在我的问题是这两个approa的区别是什么CHES?哪一个更好或推荐?并且,当使用方法#2时,如果最终用户离开经过验证的页面导航但尚未注销,则会话在闲置10分钟后仍然超时?

回答

2

会话超时可以在各个层次上进行设置:

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

由于罗马写道,无论您如何设置它,超时到期时它将被容器无效。

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

+0

感谢罗马和瓦斯解释的差异,也给了我一个好主意,使用哪种方法。我仍在等待完整的业务需求,以确定整个应用程序的超时是否一致,这将明确说明使用哪种方法。但是,由于你们两个都在向我解释差异。现在,由于我不能将两个答案都标记为我的问题的答案,所以我将Gas的解决方案标记为已接受的答案(没有特别的理由),并对Roman的答案进行投票。再次感谢 – Sai 2014-10-03 19:01:25

2

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

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

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

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

相关问题