如果我们的某个页面上设置了超时,并且在另一个窗口/选项卡中打开了同一页面,是否有办法在另一个窗口中销毁/停止超时?我们的员工将使用我们的系统,但会从他们的收藏夹再次打开它。如果他们这样做,已打开的窗口将运行间隔,然后超时。因此,当他们在新窗口中工作时,他们打开了他们将无法完成他们正在做的事情,因为另一个窗口将他们计时。
如果打开一个新窗口,是否有解决方案?
答案 0 :(得分:2)
在任何理智的 Web应用程序中,打开多个窗口是安全的 - 特别是在会话超时方面,因为“会话”状态由服务器管理,不是客户。
首先,考虑Web服务器管理会话状态的原因。 HTTP被设计为无状态协议,这意味着任何给定的请求都无法最终确定发出请求的人。这对于提供静态资源很好,但如果我们想要开发一个更具交互性的应用程序,这显然没有用; Netscape later在其浏览器中添加了Cookie以解决此问题。
Cookie解决状态问题(因为浏览器会使用cookie [s]发出后续请求),但它们本质上是不安全的:恶意客户端可以修改网站的cookie。例如,如果在登录时我们为用户的ID设置了一个名为uid
的cookie,那么有人伪造一个uid=1
的cookie(这可能是您网站的管理员帐户)是微不足道的。糟糕。
这就是Web应用程序框架发明“会话”构造的原因。每次发出没有cookie的请求时,服务器都会创建一个新的(随机)会话密钥,并将客户端的会话cookie设置为该密钥。 Web服务器跟踪会话以及与每个会话关联的所有状态。这里重要的是密钥本身不包含任何数据,足够大且随机(具有相对较高的entropy),并且在服务器之外是无用的。因此,不可能知道如何更改密钥以获得对其他会话的访问权。
将会话视为一个大型数组 - 每个会话一个项目,以及该项目中的变量映射。从概念上讲,它可能看起来像这样:(请记住,这些数据驻留在服务器上!)
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,如果为服务器堆栈添加了标记,将会很有帮助。)
总结所有这些:如果您在客户端上进行任何类型的会话管理/过期,那么您做错了。您的应用可能不安全。