使用 web.xml 和 setMaxInactiveInterval() 设置 HTTP 会话超时有什么区别

问题描述 投票:0回答:2

我有一个要求,当用户通过身份验证进入会话时,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 分钟不活动后是否仍然会超时?

session servlets cache-control
2个回答
10
投票

可以在不同级别上设置会话超时:

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

正如罗马所写

无论你如何设置,超时后都会被容器失效。

您应该避免使用编程方法(最后一种),因为很容易错过某些会话,并且它将获得默认超时,并且您将出现不一致的行为。如果您想确保给定的超时(业务需求)并且不想依赖服务器功能,请使用

web.xml


7
投票

第一种方法是在所有会话的配置中使用静态常量。第二种方法是动态的,您可以在运行时使用 servlet API 动态设置值,并且仅影响调用该方法的会话。一旦设置了该值,无论使用哪种方法,容器都会使会话失效。看看医生怎么说

HttpSession#setMaxInactiveInterval(int)

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

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

部署描述符

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

© www.soinside.com 2019 - 2024. All rights reserved.