【问题标题】:Trigger client side event when session in lost会话丢失时触发客户端事件
【发布时间】:2013-08-10 08:11:33
【问题描述】:

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

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

我知道。

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

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

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

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

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

或者,还有其他建议吗?

【问题讨论】:

  • 是否必须在页面处于非活动状态并且没有任何事情发生时?当用户尝试做某事(单击按钮、导航某处等)时,您可以检查会话超时
  • 另外请记住,每秒通过 AJAX 检查会刷新会话并有效地防止会话超时。
  • @gpinkas 确实,我需要在页面加载时完成的 AJAX 请求之类的东西,该请求永远不会返回任何内容,并且错误(由于服务器重置或会话超时)提示用户。这会是一个解决方案吗?
  • @YuriyGalanter 它必须是“实时的”,用户必须在会话丢失的那一刻得到通知。

标签: javascript session asp-classic


【解决方案1】:

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

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

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

Google 是您的朋友,one of the first results 提供了一个不错的方法基础概述。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 这可能是一个很好的解决方案。同样,因为 AJAX 请求是在用户填写表单以动态修改某些选择框的内容时完成的,如果会话丢失,则某些
    • @ÉrikRykDesjardins 就像我说的,当用户填写表单时会话丢失时,只需显示一个模式登录表单,您的会话再次有效......
    【解决方案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 重置,您可以通过在 global.asa 中实现 Application_OnStart 来清除数据库中保存的会话。这样,您的客户端将通过 IIS 重置检测到会话丢失。

    另一种快速而肮脏的方法

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

    【讨论】:

    • 这肯定是一个完整的答案。谢谢,我今天会尝试整个事情。这实际上很有意义。希望它能让这里的每个人都满意--!
    • 太好了,如果它适合你,请告诉我。祝你好运!
    【解决方案4】:

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

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

    【讨论】:

    • 那将是一个很好的解决方案。问题是会话可以从其他地方结束。例如,如果 IIS 被重置,所有会话都会丢失,但在这种情况下,不会通知用户。
    • @ÉrikRykDesjardins - 我深深怀疑你必须把它当作你能得到的最好的东西,而不会变得过于复杂。您将无法涵盖在客户端窗口打开时会话可能丢失的所有方式。更好的问题可能是你为什么需要这个?
    • @ÉrikRykDesjardins。对于那些场景,您将不得不进行服务器交互。例如。用户点击表单提交,服务端代码实现session去kaput并相应动作
    • @AnonJr 用户必须填写大量表格,这些表格在完成之前无法保存(我的老板不会考虑任何其他选择)。有很多需要身份验证的 ajax 请求。如果重置服务器,则无法访问 ASP 脚本,因为用户未通过身份验证。该页面需要在会话丢失时通知用户,以便他或她可以重新输入凭据以继续使用该页面。
    • @ÉrikRykDesjardins 很好,当您提到的 asp 脚本已经知道用户何时未通过身份验证时,只需显示登录弹出窗口或类似的东西,然后通过 Ajax 登录用户......您不必通知会话丢失的客户端。
    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多