会话超时问题

Session timeout issues

本文关键字:问题 超时 会话      更新时间:2023-09-26

如果在我们的一个页面上设置了超时,并且在另一个窗口/选项卡中打开了同一个页面,有没有办法在另一窗口中销毁/停止超时?我们的员工会使用我们的系统,但会从他们的收藏夹中再次打开它。如果他们这样做,已经打开的窗口将运行间隔,然后超时。因此,当他们在打开的新窗口中工作时,他们将无法完成正在做的事情,因为另一个窗口使他们超时。

如果打开新窗口,是否有解决方案?

在任何saneweb应用程序中,打开多个窗口是安全的–特别是在会话超时方面,因为"会话"状态由服务器管理,而不是由客户端管理。

首先,考虑web服务器管理会话状态的原因。HTTP被设计为无状态协议,这意味着任何给定的请求都不能最终确定是谁发出了请求。这对于提供静态资源来说很好,但如果我们想开发一个更具互动性的应用程序,显然是没有用的;Netscape后来在浏览器中添加了cookie来解决这个问题。

cookie解决了状态问题(因为浏览器会用cookie发出相应的请求),但它们本质上是不安全的:恶意客户端可能会修改网站的cookie。例如,如果在登录时,我们将一个名为uid的cookie设置为用户ID,那么有人用uid=1(可能是您网站的管理员帐户)伪造cookie将是微不足道的。哎呀。

这就是web应用程序框架发明"会话"结构的原因。每次在没有cookie的情况下发出请求时,服务器都会创建一个新的(随机)会话密钥,并将客户端的会话cookie设置为该密钥。web服务器跟踪会话以及与每个会话相关联的所有状态。重要的是,密钥本身不包含数据,足够大且随机(具有相对较高的熵),在服务器之外毫无用处。因此,不可能知道如何更改密钥以访问其他会话。

将会话视为一个大型阵列–每个会话一个项目,以及该项目中的变量映射。从概念上讲,它可能看起来像这样:(记住,这些数据驻留在服务器上!)

session['safa4fwsa34rff4j9'] = { uid: 1, ... }
session['ajiokinmoi3235000'] = { uid: 4312, ... }
session['9lij34fff032e40k0'] = { uid: 9098, ... }

如果我以用户1的身份登录,我的浏览器会发送一个带有sid=safa4fwsa34rff4j9的cookie。服务器查找此会话,并将保存的状态({uid:1})传递给脚本。脚本完成后,服务器将所有更改保存回其数据存储中。(会话数据通常保存在内存中,但在大型站点中,会话数据可以保存在数据库中。)

那么,这一切与超时有什么关系呢?这个会话数据不能无限期地保存,因为你最终会耗尽存储空间(无论这意味着RAM耗尽还是填满了存储会话的数据库)。

相反,服务器还存储到期日期&每次会话的时间。每次访问会话(通过客户端发送带有会话密钥的请求)时,过期日期都会重置。过期日期可以设置为从现在起几秒钟到几年(取决于您使用的服务器)。您可以配置您希望服务器挂起会话的时间;IIS默认为10分钟,PHP默认为~24分钟。


在这个模型中,唯一真正重要的是客户端最后一次发出任何请求,从而重置其会话的到期/超时时间。如果打开了多个窗口也没关系,因为只要其中一个窗口最近访问过某个页面,所有窗口都将处于活动状态。如果会话过期,则所有窗口在发出下一个请求时都会自动过期。

如果你正在进行某种AJAX轮询,可能会混淆这个问题,但这个问题并没有表明正在使用什么技术。(@OP,如果你在服务器堆栈中包含标签,那会很有帮助。)

总结所有这些:如果您在客户端上进行任何类型的会话管理/过期,都是错误的您的应用程序可能不安全。