显示会话过期消息

时间:2012-05-22 13:13:12

标签: php javascript jquery session session-timeout

我希望我的页面在会话过期时显示警报。我搜索了堆栈并找到了MVC with JQuery: handling Session Expire

这个很棒的链接解释了如何保留会话。但问题是它使用计时器。在我的情况下,用户可能会将系统保持在睡眠模式,从而使网页保持打开状态。在这种情况下,计时器停止工作。请求告诉我一个方法,以便我的代码知道会话已经过期,即使系统进入睡眠模式然后醒来。

2 个答案:

答案 0 :(得分:2)

在所有浏览器和所有平台上运行这样的东西的唯一方法是通过轮询。你可以使用javascript setInterval来经常进行ajax调用。如果将时间间隔设置为低于服务器超时的时间,那么您将续订会话,任何内容都不会过期。如果你将它置于服务器超时时间之上,那么你就会知道它是否确实过期并告诉客户它是否已经过期。

答案 1 :(得分:0)

将会话cookie从php存储到浏览器以设置会话结束信息是很常见的。在服务器端,过期信息存储在db中。在每个用户请求服务器上更新cookie和数据库。使用jquery cookie插件,您可以检查会话何时到期。您可以通过轮询(而不是池化)来执行此操作,就像其他人建议的那样,在会话到期时设置计时器事件。

修改

我有一个类似的应用程序,我正在努力。这是我做的: 在每个ajax请求的php中我设置了cookie

$exp_gmt = gmdate("D, d M Y H:i:s", time() + $this->allowcache_expire * 60)." GMT";
header("Expires: ".$exp_gmt);
header("Cache-Control: max-age=".$this->allowcache_expire * 60, false);

然后我在客户端使用这个jquery插件(对不起,我不记得我在哪里找到它)

jQuery.cookie = function(d, e, b) {
    if(arguments.length > 1 && String(e) !== "[object Object]") {
        b = jQuery.extend({}, b);
        if(e === null || e === undefined) {
            b.expires = -1
        }
        if( typeof b.expires === "number") {
            var g = b.expires, c = b.expires = new Date();
            c.setSeconds(c.getSeconds() + g)
        }
        e = String(e);
        return (document.cookie = [encodeURIComponent(d), "=", b.raw ? e : encodeURIComponent(e), b.expires ? "; expires=" + b.expires.toUTCString() : "", b.path ? "; path=" + b.path : "", b.domain ? "; domain=" + b.domain : "", b.secure ? "; secure" : ""].join(""))
    }
    b = e || {};
    var a, f = b.raw ? function(h) {
        return h
    } : decodeURIComponent;
    return ( a = new RegExp("(?:^|; )" + encodeURIComponent(d) + "=([^;]*)").exec(document.cookie)) ? f(a[1]) : null
}; 

我的页面上还有一个时钟:

showTime : function() {
    var today = new Date();
    var curr_date = today.getDate();
    var curr_month = today.getMonth() + 1;
    var curr_year = today.getFullYear();
    var curr_hour = today.getHours();
    var curr_min = today.getMinutes();
    var curr_sec = today.getSeconds();
    if(curr_date < 10)
        curr_date = '0' + curr_date;
    if(curr_month < 10)
        curr_month = '0' + curr_month;
    if(curr_hour < 10)
        curr_hour = '0' + curr_hour;
    if(curr_min < 10)
        curr_min = '0' + curr_min;
    if(curr_sec < 10)
        curr_sec = '0' + curr_sec;
    var curr_full = curr_date + "/" + curr_month + "/" + curr_year + "<br />" + curr_hour + ":" + curr_min + ' <span style="font-size:0.8em">' + curr_sec + '</span>';
    $('#clock').html(curr_full);
    setTimeout("showTime()", 1000);
}

在时钟功能结束时,您可以阅读cookie并将其与当前时间进行比较,以查看它是否已过期。