会话超时问题
Session timeout issues
如果在我们的一个页面上设置了超时,并且在另一个窗口/选项卡中打开了同一个页面,有没有办法在另一窗口中销毁/停止超时?我们的员工会使用我们的系统,但会从他们的收藏夹中再次打开它。如果他们这样做,已经打开的窗口将运行间隔,然后超时。因此,当他们在打开的新窗口中工作时,他们将无法完成正在做的事情,因为另一个窗口使他们超时。
如果打开新窗口,是否有解决方案?
在任何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,如果你在服务器堆栈中包含标签,那会很有帮助。)
总结所有这些:如果您在客户端上进行任何类型的会话管理/过期,都是错误的您的应用程序可能不安全。
- iOS Safari Javascript设置超时问题
- Selebyun爬网程序超时问题C#
- 是否从超时内开始间隔是一个问题
- 设置超时功能在 chrome 扩展程序弹出窗口.js问题
- 清除超时的问题
- 加载资源时出现 OpenTok JS 连接超时问题
- 设置超时问题
- 线程休眠和设置超时问题
- 超时时单击动态标签时出现问题
- 正在获取ice候选项收集的超时问题
- 超时和滚动问题
- 会话超时问题
- 在For循环上设置超时/延迟的问题
- 下拉菜单超时问题
- 会话超时有问题
- JQuery超时问题与mouseout函数
- 这个清除超时有什么问题?
- setTimeout问题,则没有超时
- 多个javascript超时-实时数据获取的问题
- 循环延迟超时问题