【问题标题】:How to handle session time out warning with JQuery and ColdFusion?如何使用 JQuery 和 ColdFusion 处理会话超时警告?
【发布时间】:2018-08-18 14:35:46
【问题描述】:

我目前有 JS 函数来处理我的单页应用程序中的会话超时。第一次尝试似乎是我拥有的最佳解决方案。只需在页面加载时触发此功能并将 Ajax 调用发送到服务器以保持会话活动。然后我为此目的找到了更好的解决方案。 ColdFusion 具有onRequestStart() 功能,每次用户重新加载页面或向服务器发送请求时都会触发该功能。我已经在该函数中设置了时间标志。这是一个例子:

<cffunction name="onRequestStart" returnType="boolean" output="false">
     <cfargument name="thePage" type="string" required="true">
     <cfset REQUEST.appName = 'Single Page Application'>
     <cfset REQUEST.lastHit = now()>
     <cfreturn true>
</cffunction>

在我的主页.cfm 页面上,我使用toScript() 将lastHit 转换为JS。这是一个例子:

<script type="text/javascript" language="JavaScript">  
     <cfoutput>
         var #toScript(REQUEST.lastHit, "lastHit")#  
     </cfoutput>
     // Check last hit on every request
     var getLastHitTime = new Date(lastHit).getTime();
</script>

我想知道如何从 lastHit 时间戳开始计算 30 分钟?这样,每次用户向服务器发出请求时,此功能都会刷新。如果他们在 28 分钟内没有击中服务器,给他们一个警告并开始倒计时 120 秒。我想知道实现这一目标的更简单方法是什么?我看到 JQuery 有一些插件,但不确定如何使用它或者该插件是否可靠。使用 onRequestStart lastHit 范围值我会阻止向服务器发送 Ajax 请求,因为我有用户和服务器之间最近交互的时间戳。如果有人可以提供一些建议或示例,请告诉我。谢谢。

【问题讨论】:

  • hmm... 将不同的状态代码返回给未登录的 ajax 请求不是更简单,那么如果您有一个会话 ID 客户端,您就知道它已超时,或者如果您没有会话 ID,则您知道用户未登录。如果您依赖时间戳,那么如果会话因任何其他原因结束,则很容易中断。
  • @KevinB 假设用户正在输入一些真正的长格式并稍作休息然后回来然后继续输入,因此 29 分钟内没有请求发送到服务器。一旦服务器计数 30 分钟,用户将在没有任何警告的情况下被踢出并丢失所有数据。在我看来,我应该在会话到期前 2 分钟给他们一个警告。如果他们单击“确定”继续,那么我会向服务器发送 ping。
  • 您可能希望以某种间隔定期检查当前时间,但请记住,非活动选项卡中的时间间隔与活动选项卡中的触发方式不同。如果这种情况很常见,我建议以某种方式将用户信息保存在本地存储中。
  • @KevinB 有没有关于如何在 JQuery 或 JS 中处理会话超时的好例子?
  • 我们使用 javascript 计时器来处理这类事情。根据实际页面,我们将允许他们的登录失效并显示相应的文字,或者在耗时的数据输入页面的情况下,采取一些措施让他们保持登录状态。允许登录失效是默认行为。

标签: javascript jquery timer coldfusion session-timeout


【解决方案1】:

如果是单页网站,可以在页面加载时启动 JS 计时器来显示警告:

<script type="text/javascript">
setTimeout(function(){
    alert('You are about to lose unsaved changes. Please post the form.');
}, 25 * 60 * 1000); // 25 minutes
</script>

如果你想无限期地保持会话:

<script type="text/javascript">
var keepAlive = setInterval(function(){
    $.ajax({
        'type': "GET",
        'url': "/includes/blank.cfm?rand="+ Math.random(),
        'success': function (data) {
            tmp = data;
        }
    });
}, 25 * 60 * 1000); // 25 minutes
</script>

只要确保指向一个真正的 CFM,即使它是一个空白文件。

【讨论】:

  • 感谢您提供示例。您是否有理由在 ajax 调用中使用 Math.random() 作为参数?
  • GET 被缓存。您要确保请求到达服务器。随机 url 变量对此有所帮助。您可以改为 POST,但 GET 性能更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
相关资源
最近更新 更多