2012-01-24 101 views
0

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

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

+1

您无法在页面之间进行通信。你可以做的是使用cookies或者'localStorage'来传播一些状态到页面。你的代码必须定期检查。 –

+0

我第二个cookie解决方案。除此之外,您还可以进行某种服务器端监控...... –

+0

第一个窗口如何超时第二个窗口?只有通过请求到服务器,对不对?那么为什么你需要客户与客户之间的沟通? –

回答

2

在任何理智 Web应用程序,它是安全的打开了多个窗口–尤其是对于会话超时,因为“会话”状态由服务器,而不是客户端管理。

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

Cookie解决了状态问题(因为浏览器会使用cookie发出随后的请求),但它们本质上是不安全的:恶意客户可能会修改站点的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,我的浏览器会发送一个cookie与sid=safa4fwsa34rff4j9。服务器查找此会话,并将保存的状态({uid:1})传递给脚本。脚本完成后,服务器会将所有更改保存回其数据存储。 (会话数据通常保存在内存中,但在大型站点中,会话数据可以保存在数据库中。)

那么,所有这些与超时有什么关系?此会话数据不能无限期保存,因为您最终会耗尽存储空间(无论这意味着RAM耗尽或填充会话存储在其中的数据库)。

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


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

如果您正在进行某种类型的AJAX轮询,可能会混淆此问题,但问题并未指出正在使用哪种技术。 (@OP,如果你为服务器堆栈包含标签会很有帮助)。

总结所有这些:如果你在客户端上做任何种类的会话管理/失效,你做错了。您的应用可能不安全。

+0

非常感谢您给我一个关于如何做到这一点的想法,而且在您的回复中也非常详尽。我将来肯定会确保我包含使用的服务器和技术。我们确实使用AJAX轮询,这听起来可能是一个问题,但现在我们可以看看它,看看它是如何被编程和实现的。再次感谢你。 – pertrai1