代码之家  ›  专栏  ›  技术社区  ›  Braintapper

使用Ajax自动刷新在Web应用程序上超时会话的方法

  •  4
  • Braintapper  · 技术社区  · 14 年前

    我正在编写一个Web应用程序,它可以在设置的时间间隔内使用Ajax调用自动刷新数据。

    因为这样做了,服务器端用户会话永远不会超时,因为上一个活动是通过每次Ajax调用刷新的。

    有没有好的客户端规则可以让用户超时?例如,我应该跟踪浏览器中的鼠标移动,还是应该将Ajax调用指向不刷新会话的URL?

    我喜欢我的Ajax调用命中一个启用会话的URL,因为我还可以验证用户是否登录等等。

    对于我是否应该费心为用户计时有什么想法吗?

    3 回复  |  直到 14 年前
        1
  •  3
  •   kevingessner    14 年前

    我使用的一种技术是:每次调用时增加Ajax调用之间的间隔。所以,在10秒后进行第一次Ajax调用,然后等待11秒、13秒、16秒、20秒、25秒等等…(或者类似的模式)。每次有页面活动(通过注册一些JS事件找到)时,都会将间隔重置回初始值(例如10秒)。

    当Ajax间隔比超时时间长时,这种技术最终会导致暂时不接触浏览器的用户超时。作为一个额外的好处,您将减少服务器负载——如果用户长时间保持浏览器窗口打开,他们将在超时前发出越来越少的请求。

        2
  •  3
  •   Ken Browning    14 年前

    我提示用户在一段时间不活动后,通过javascript验证它们是否仍然处于活动状态。不活动被定义为“没有鼠标或键消息发送到窗口”。如果他们在一定时间后没有响应提示,我将重定向到注销页面。

    可以找到我的基于jQuery UI的实现 here .

        3
  •  1
  •   Colonel Sponsz    14 年前

    我通过在浏览器中维护一个“最后一个操作”时间戳并将其与心跳一起发送回服务器来完成这项工作。然后,在服务器上,我根据这个值和当前时间之间的差异检查是否超时,如果用户空闲时间过长,则调用注销例程。如果会话超时,那么心跳结果将触发浏览器重新加载页面,当会话现在在服务器上注销时,该页面将清除任何用户特定的信息。

    我必须用这种方法解决的两个主要问题是服务器和客户机日期函数实现中时区的不同解释,如果用户在同一个浏览器中打开了多个选项卡,将不同的“最后一个操作”时间戳发送回服务器,则可以跟踪最新的操作。