Javascript 会话超时问题

Javascript 会话超时问题,javascript,Javascript,如果在我们的一个页面上设置了超时,并且在另一个窗口/选项卡中打开了同一页面,是否有方法在另一个窗口中销毁/停止超时?我们的员工会使用我们的系统,但会从他们的收藏夹中再次打开它。如果他们这样做,已经打开的窗口将运行间隔,然后超时。因此,当他们在他们打开的新窗口中工作时,他们将无法完成他们正在做的事情,因为另一个窗口将他们超时 如果打开一个新窗口,是否有解决方案可以做到这一点?在任何正常的web应用程序中,打开多个窗口都是安全的,特别是在会话超时方面,因为“会话”状态是由服务器管理的,而不是由客户端

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

如果打开一个新窗口,是否有解决方案可以做到这一点?

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

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

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

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

将会话视为一个大数组–每个会话一个项目,该项目中有一个变量映射。从概念上讲,它可能是这样的:(请记住,此数据驻留在服务器上!)

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

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

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


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

如果您正在进行某种AJAX轮询,则可能会使这个问题变得混乱,但问题并没有指出正在使用什么技术。(@OP,如果您为服务器堆栈包含标记,这将非常有用。)


总而言之:如果您在客户端上执行任何类型的会话管理/过期操作,那么您就是做错了。您的应用程序可能不安全。

您无法在页面之间进行通信。不过,您可以使用cookie或
localStorage
将某些状态传播到页面。然后,您的代码必须定期检查这些问题。我支持cookie解决方案。除此之外,您还可以进行某种服务器端监视……第一个窗口如何超时到第二个窗口?只能通过对服务器的请求,对吗?那么,为什么需要客户端到客户端的通信呢?关于第一个窗口时间超出第二个窗口,我提到了他们在我们的系统中工作的事实。为了在系统内工作,需要向服务器发出请求。因此,如果第一个窗口在第二个窗口中完成请求之前将它们从系统中超时,那么第二个窗口请求是否会发送到服务器?我不这么认为,因为系统中不再考虑它们。如果我错了,请纠正我,这样我们就可以尝试了解如何消除超时问题。我们将使用定期检查的cookie。@FelixKling:这不完全正确。我们总是能够打开一个新窗口并保留对它的引用(假设来源相同):
var w=window.open(第页);w、 函数definedotherpage()。此外,HTML5还引入了一种新的技术,它允许在浏览上下文之间传递消息,并且可以跨源工作。非常感谢您不仅为我提供了如何做到这一点的想法,而且在您的回复中也非常透彻。我一定会确保在未来,我包括服务器和使用的技术。我们确实使用AJAX轮询,这听起来可能是个问题,但现在我们可以看看它是如何被错误地编程和实现的。再次感谢你。
session['safa4fwsa34rff4j9'] = { uid: 1, ... }
session['ajiokinmoi3235000'] = { uid: 4312, ... }
session['9lij34fff032e40k0'] = { uid: 9098, ... }