【问题标题】:checking session timeout when using AJAX使用 AJAX 时检查会话超时
【发布时间】:2014-03-11 06:12:30
【问题描述】:

我有一个 ColdFusion 页面,用户可以打开一个模式并查看有关一行数据的更多信息。但是,如果用户在页面上停留的时间超过默认的 20 分钟会话超时,则会引发错误,因为它正在查找会话变量但找不到它们。我了解如何使用服务器端代码来捕获此问题,但我似乎无法让 AJAX 调用成功确定会话是否仍然存在。

这是当用户点击按钮打开模式时触发的 AJAX 代码。基本上它检查会话是否存在于 CFC 中的函数。我的问题是它总是返回“有效”。

//this checks if the session is expired
function checkSessionExists() {
    $.ajax({
        //this is the that has function
        url: 'components/Admin.cfc',

        //POST method is used
        type: "POST",
        //pass the data        
        data: {
            method: "checkSessionExists"
            },
        async:   false,
        success: function(response) {

            //$('#loading').hide();
            var obj = $.trim(response);

            if (obj == 'expired') { //it's never expired
                alert('Sorry, your session has expired.')
                window.location.href = "logout.cfm";
                return false;
            }

            else{

            }
        },
        error: function(jqXHR, exception) {
            alert('Uncaught Error.\n' + jqXHR.responseText);   
        }
    });
return false;
}

这是 CFC 中的函数:

<cffunction name="checkSessionExists" access="remote" output="false" returntype="string" returnformat="plain" hint="I check if session is expired."> 

    <cfif NOT structKeyExists(session, "alive")>
        <cfreturn "expired" />
    <cfelse>
        <cfreturn "valid" />
    </cfif>

</cffunction>

我在想,当我询问 CFC 会话是否存在时,它仍然具有会话变量,因为页面在 20 多分钟内没有刷新。所以......想知道我将如何向 CFC 发送 AJAX 请求并在 CFC 中具有重新评估会话变量的功能。任何帮助将不胜感激!

【问题讨论】:

    标签: jquery ajax session coldfusion


    【解决方案1】:

    我将取决于您如何设置 session.alive 值。请记住,只要会话中存在活动,您的代码就会返回“有效”。如果 session.valid 在会话初始化代码中设置,您将得到您所看到的响应。

    对 .cfm 的任何请求都会导致会话超时值重置为 now()+会话持续时间。我过去用它来:

    1. 监听页面上的按键或点击事件。如果发生任何此类事件,请设置一个布尔标志
    2. 每隔几分钟检查一次该值,如果该值为真,则发送一个 ajax 调用以保持会话处于活动状态。然后将变量设置回 false

    然后循环重复。这意味着如果您的用户正在与站点交互,他们的会话将保持打开状态,并且不会在他们所做的事情结束时被抛出。如果您的业务/站点会话策略允许,这可能是一个非常好的设置。

    【讨论】:

    • +1 你比我快 10 秒;)(我会删除我的答案,因为我们基本上是在说同样的话)
    • 嘿嘿抱歉。如果不是 Chrome StackTrack 插件,我永远不会及时回答任何问题
    • 我不得不做类似的事情。我使用了一个像素的 iframe,对用户不可见。里面是一个带有元刷新标签的冷融合页面。请注意,这种方法意味着用户不必在浏览器上执行任何操作。那是故意的。这可能不适合您的情况,但适合我的情况。
    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 2012-12-15
    • 2011-03-26
    • 1970-01-01
    • 2010-12-11
    • 2015-09-08
    • 1970-01-01
    • 2013-01-19
    相关资源
    最近更新 更多