会话丢失时触发客户端事件

时间:2013-08-08 14:43:03

标签: javascript session asp-classic

正如你们中的一些人可能知道的那样,Facebook正在使用这种“系统”,当用户会话由于不活动或远程会话关闭而丢失时会显示弹出窗口。我已经看过并阅读了这个Node.js question但没有找到任何内容。

我在加拿大的一家计算机公司工作,我们的主要产品是CRM,所有东西都是用经典ASP编码的。

我知道。

整个基于Web的应用程序运行良好,因为我们在服务器上托管该站点,所以可以在必要时打开端口并使用套接字。

这里有一个主要问题:有没有办法(使用javascript库或jQuery插件?)来在会话到期时触发客户端事件或者只是丢失到期以服务器重置为例?

当然,最好的方法是使用另一种解决方案,而不是每秒发送一次AJAX请求来验证用户会话是否仍然存在。如果它可以提供帮助,同时最多可以连接约3,500个用户,我们的服务器可以轻松处理更多流量。这些服务器与IIS 7一起在Windows Server 2008上运行。

不幸的是,我无法为此问题提供任何代码块或屏幕截图,因为无需调试。

一个想法是对一个不返回任何东西的文件使用AJAX请求并挂起。如果会话丢失(不活动或服务器重置),AJAX请求将触发错误并触发“错误”功能。这会是需要考虑的吗?

或者,还有其他任何建议吗?

4 个答案:

答案 0 :(得分:3)

一种方法是将客户端计时器设置为与会话到期时间相同的时间。

假设您的会话设置为在20分钟后过期。页面加载时 - 客户端计时器设置为20分钟。如果用户进行任何服务器交互(提交表单等) - 重置计时器。但如果在这20分钟内没有任何反应 - 计时器倒计时,你就会得到你的活动。

答案 1 :(得分:3)

假设您的默认会话超时为20:00分钟,您可以执行以下操作来实现此目的:

  1. 确保每个用户都有一个“会话cookie”,而不是默认的ASP会话Cookie。

    dim live_session_id
    live_session_id = Request.Cookies("livesession")
    if live_session_id = "" then
        live_session_id = create_unique_session_id()
        Response.Cookies("livesession") = live_session_id
    end if
    
  2. 将此live_session_id与预期的会话过期日期

    一起保存在数据库中
    call updateSession(live_session_id, dateadd("n", 20, now())) ' = now()+20min
    
  3. 在页面的某处输出live_session_id,以便您可以通过JS访问它。

  4. 实现一个服务器端ASP脚本,该脚本检查给定live_session_id的当前会话状态,并使其在IIS中的不同子域中可访问,因此调用此检查不会刷新ASP会话。该脚本可以返回现在和会话结束之间的时间差,因此您可以输出会话保持有效的持续时间。

  5. 添加一些AJAX代码以每隔一秒调用一次检查脚本,因此如果会话时间结束,您可以发出警告。

  6. 要使其检测到IIS重置,您可以通过在Application_OnStart中实施global.asa来清除数据库中保存的会话。这样,您的客户端将通过IIS重置检测到会话丢失。

  7. 另一种快速而又脏的方法

    在每次加载页面时,您可以让javascript从20:00分钟开始倒计时,并在此时间后显示会话丢失警告。这就是我的网上银行系统使用的......:)

答案 2 :(得分:1)

据我所知,主要问题是用户必须填写大量表格。这可能需要一些时间,在此期间会议可能会到期。

此外,在用户填写表单期间,会话可以通过其他任何内容(iisreset左右)结束。

据我了解,您不必通知客户会话丢失/过期/已结束/已放弃。只要在用户提交表单时显示一个Login表单(Ajax或其他内容),或者客户端发出下一个请求(通过Ajax提交)就足够了。

被调用的asp脚本检查会话是否有效,如果没有显示弹出窗口或叠加层,则首先通过Ajax登录用户,然后提交表单。

你可以想到一个http状态代码401或者什么东西发送回客户端然后客户端显示提到的Ajax登录表单......

答案 3 :(得分:0)

什么使会话在您的CRM中过期?自上次[用户]操作以来经过X时间后过期非常传统,并允许您使用ajax来保持会话处于活动状态。假设一个会话有效5分钟作为超级秘密NSA银行CRM与小猫和YouTube视频的安全要求的一部分。如何扩展会话的一个好方案是:

  1. 打开一个页面,再验证会话5分钟
  2. 使用JS设置超时,每4分钟发出一次ajax请求
  3. [4分钟后]提出请求,返回一个非常轻量级的响应。
  4. 如果响应显示一切正常并且会话仍然有效,请安排另一个“ping”并继续照常进行。如果响应返回错误(由于从其他PC等登录,服务器上的会话无效),请正常处理它。允许用户保留他们正在工作的内容,不要只是将他们带到登录屏幕并显示错误
  5. 用户导航离开页面(单击链接,提交表单),从头开始重复。如果用户导航到外部站点或关闭浏览器,他的会话将在不超过5分钟内自毁:)
  6. 显然,您可以在步骤3中将任何其他信息捎带到ajax调用上 - 例如通知用户在CRM中分配给他们的新项目?

    Google是您的朋友,one of the first results对方法基础进行了不错的概述。