【问题标题】:Show session expired message显示会话过期消息
【发布时间】:2012-05-28 23:41:09
【问题描述】:

我希望我的页面在会话过期时显示警报。我通过堆栈搜索,发现MVC with JQuery: handling Session Expire

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

【问题讨论】:

  • 您是否尝试使用计时器来检查页面加载与当前时间之间的差异?

标签: php javascript jquery session session-timeout


【解决方案1】:

让这种东西在所有浏览器和所有平台上运行的唯一方法是通过轮询。您可以使用每隔一段时间执行一次 ajax 调用的 javascript setInterval。如果您将时间间隔设置为低于服务器超时的时间,那么您将更新会话并且不会过期。如果你把它放在服务器超时时间之上,那么你就会知道它是否真的过期并告诉客户端它已经过期了。

【讨论】:

    【解决方案2】:

    将会话cookie从php存储到浏览器以设置会话结束信息是很常见的。在服务器端,过期信息存储到数据库中。在每个用户请求服务器更新 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并将其与当前时间进行比较以查看是否过期。

    【讨论】:

    • 你的意思是轮询,我猜不是池化。 :)
    • @Johntor,如果系统进入睡眠模式,计时器将停止。如果会话已过期,当它唤醒时,如何向用户显示会话已过期的警报?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多