如果我们的一个页面设置了超时,并且在另一个窗口/选项卡中打开同一页面,是否有办法销毁/停止另一个窗口中的超时?我们的员工会使用我们的系统,但会从他们的收藏夹中再次打开它。如果他们这样做,已经打开的窗口将运行间隔,然后超时。因此,当他们在打开的新窗口中工作时,他们将无法完成他们正在做的事情,因为另一个窗口超时了。
如果打开新窗口,是否有解决方案可以做到这一点?
最佳答案
在任何正常的 Web 应用程序中,打开多个窗口都是安全的 - 特别是在 session 超时方面,因为“ session ”状态是由服务器管理的,不是客户端。
首先,考虑为什么 Web 服务器管理 session 状态。 HTTP被设计为无状态协议(protocol),这意味着任何给定的请求都无法最终确定是谁发出了该请求。这对于提供静态资源来说很好,但如果我们想开发一个更具交互性的应用程序,这显然没有用处;网景later在浏览器中添加了 cookie 来解决这个问题。
Cookie 解决了状态问题(因为浏览器将使用 cookie 发出后续请求),但它们本质上是不安全的:恶意客户端可能会修改站点的 cookie。例如,如果在登录时我们将一个名为 uid
的 cookie 设置为用户的 ID,那么某人使用 uid=1
伪造 cookie 就很容易了,这可能是您网站的管理员帐户。哎呀。
这就是 Web 应用程序框架发明“ session ”结构的原因。每次发出不带 cookie 的请求时,服务器都会创建一个新的(随机) session key ,并将客户端的 session cookie 设置为该 key 。 Web 服务器跟踪 session 以及与每个 session 相关的所有状态。这里重要的是 key 本身不包含数据,足够大且随机(具有相对较高的 entropy ),并且在服务器之外无用。因此不可能知道如何更改 key 来访问其他 session 。
将 session 视为一个大数组 - 每个 session 一个项目,以及该项目中的变量映射。从概念上讲,它可能看起来像这样:(请记住,该数据驻留在服务器上!)
session['safa4fwsa34rff4j9'] = { uid: 1, ... }
session['ajiokinmoi3235000'] = { uid: 4312, ... }
session['9lij34fff032e40k0'] = { uid: 9098, ... }
如果我以用户 1
身份登录,我的浏览器将发送带有 sid=safa4fwsa34rff4j9
的 Cookie。服务器查找此 session ,并将保存的状态 ({uid:1}
) 传递到您的脚本。脚本完成后,服务器会将所有更改保存回其数据存储中。 ( session 数据通常保存在内存中,但在大型站点中, session 数据可以保存在数据库中。)
那么这一切与超时有什么关系呢?此 session 数据无法无限期保留,因为您最终会耗尽存储空间(无论这意味着耗尽 RAM 还是填满存储 session 的数据库)。
相反,服务器还存储每个 session 的到期日期和时间。每次访问 session (通过客户端使用 session key 发送请求)时,都会重置到期日期。到期日期可以设置为从现在开始的几秒到从现在开始的几年之间的任何时间(取决于您使用的服务器)。您可以配置希望服务器保留 session 的时间; IIS 默认为 10 分钟,PHP 默认为 24 分钟。
<小时/>在此模型中,唯一真正重要的是客户端最后一次发出任何请求,从而重置其 session 的到期/超时。如果打开多个窗口也没关系,因为只要其中一个窗口最近访问过某个页面,所有窗口仍然处于事件状态。如果 session 过期,则所有窗口在发出下一个请求时都会自动过期。
如果您正在进行某种 AJAX 轮询,但问题并未表明正在使用哪些技术,则可能会使此问题变得困惑。 (@OP,如果您包含服务器堆栈的标签,将会很有帮助。)
总结所有这些:如果您在客户端上进行任何类型的 session 管理/过期,那么您就做错了。您的应用程序可能不安全。
关于javascript - session 超时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8990904/