6

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

我在一家加拿大计算机公司工作,我们的主要产品是 CRM,一切都使用 Classic ASP 进行编码。

我知道。

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

这里是主要问题:有没有办法(可能使用 javascript 库或 jQuery 插件?)在会话过期或由于服务器重置而丢失时触发客户端事件?

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

不幸的是,我无法为这个问题提供任何代码块或屏幕截图,因为没有什么可调试的。

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

或者,还有其他建议吗?

4

4 回答 4

3

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

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

于 2013-08-08T17:47:56.657 回答
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_OnStartglobal.asa. 这样,您的客户端将通过 IIS 重置检测到会话丢失。

另一种快速而肮脏的方法

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

于 2013-08-13T14:24:42.533 回答
1

据我了解,主要问题是用户必须填写大量表格。这可能需要一些时间,在此期间会话可能会过期。

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

据我了解,您不必通知客户会话丢失/过期/结束/放弃。当用户提交表单或下一个请求(如您提到的 Ajax)由客户端发出时,仅显示登录表单(Ajax 或其他东西)就足够了。

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

您可以想到一个 http 状态代码 401 或发送回客户端的内容,然后客户端显示提到的 Ajax 登录表单...

于 2013-08-15T06:57:57.587 回答
0

是什么让您的 CRM 中的会话过期?自上次 [user] 操作以来经过 X 时间后过期是非常常规的,并且将允许您使用 ajax 来保持会话活动。假设会话为 5 分钟,作为带有小猫和 youtube 视频的超级机密 NSA 银行 CRM 的安全要求的一部分。如何扩展会话的一个很好的场景是:

  1. 打开一个页面,再验证会话 5 分钟
  2. 使用 JS 设置超时以每 4 分钟发出一次 ajax 请求
  3. [4 分钟后] 发出请求,返回一个非常轻量级的响应。
  4. 如果响应说一切正常并且会话仍然有效,请安排另一个“ping”并照常进行。如果响应返回错误(由于从其他 PC 登录等原因导致服务器上的会话无效),请优雅地处理它。允许用户保留他们正在工作的内容,不要只是将他们踢出一个错误的登录屏幕
  5. 用户离开页面(点击链接,提交表单),从头开始重复。如果用户导航到外部站点或关闭浏览器,他的会话将在不超过 5 分钟内自毁:)

显然,您可以在步骤 3 中将任何附加信息附加到 ajax 调用中 - 例如,通知用户在 CRM 中分配给他们的新项目?

谷歌是你的朋友,第一个结果给出了一个不错的方法基础概述。

于 2013-08-20T01:31:55.913 回答