在asp.net + jquery中实现自动注销+警告?

Roy*_*mir 9 javascript php c# asp.net jquery

许多站点(例如Bank webSite) - 在会话即将到期之前实施注销+ 1分钟警告.(20分钟)

(这个主题没有多少讨论 - 我见过的唯一问题是使用asp.net会员资格 - 我不使用)

每个用户都会有一个 session["lastActionTime"]

此会话将更新到当前时间:

  • 页面已加载
  • Ajax请求已执行(由于用户操作)

现在 - 当页面加载时,我设置会话值.(比如19:00)

此外,对于每个ajax请求(我的网站不创建回发 - 只有ajax jquery) - 我使用ASHX处理程序,IRequiresSessionState用于将会话更新为当前时间.

我使用这样的东西:

jQuery(document).ajaxStart(function(){
    gotoHandlerAndUpdateSessionTime();
})
Run Code Online (Sandbox Code Playgroud)

现在 - 警告信息前1分钟的部分(" 你的会话即将到期 "):

每个Ajax返回事件或page load事件-我激活的javascript:setInterval[sessionTime-1]分钟(20-1 = 19).(当然 - 取消所有上一个setIntervals ...)

现在当事件(setInterval)发生时 - 它在到期时间前1分钟:( 19分钟)

我显示一个警告div,用户可以选择exitstay.

题 :

1)如果用户没有在警告div上按任何内容,如何(显示div后1分钟)我会将他记录下来怎么办?我应该在显示div时打开1分钟的setTimeout然后(如果没有按下)将其记录下来?

2)这是正确的做法吗?

3)这整个奇怪的故事不应该有饼干吗?:-)

(请 - 没有会员资格 - 或表格认证).我也将这个问题标记为PHP,因为我知道它也与php程序员有关,我想听听他们的知识.

Ada*_*her 5

罗伊,回答你的两个问题,我会说是的.我已经多次构建这些(通常使用Forms Auth),但基本上你有一个计时器倒计时显示第一个警告,然后另一个计时器倒计时并给用户X秒回答.我通常会在警告信息上放下第二次计数,这样他们就可以看到他们还剩下多少时间.如果他们没有在规定的时间内回答,则会调用Logout.ashx(或其他)来销毁会话,然后javascript可以将它们重定向回登录页面.我希望有所帮助.

关于你的第三个问题,只要你跟踪会话,你就不应该真正需要cookie.当javascript计时器倒计时时,只需在PHP中执行session_destroy()或在C#中执行Session.Abandon().

这是我在我的一个网站上使用的一些代码(可能不是最干净的,但你明白了):

var timeoutPolled = 0;
var timeoutSeconds = 10;
var countDownCounter = 61;
var timeoutBetweenPolls = 5000;
var stopCountDown = false;

function InitializePollTimer(timeoutMinutes) {
    timeoutSeconds = timeoutMinutes * 60;

    StartPollTimer();
}

function StartPollTimer() {
    setTimeout(PollForTimeout, timeoutBetweenPolls);
}

function PollForTimeout() {
    timeoutPolled++;

    if ((timeoutPolled * timeoutBetweenPolls) > 1 * (timeoutSeconds * 1000)) {
        $("#timeoutDialog").dialog({
            autoOpen: false,
            bgiframe: true,
            resizable: false,
            height: 250,
            draggable: false,
            modal: true,
            zindex: 99999999,
            position: 'top',   
            open: function(event, ui) { $(".ui-dialog-titlebar-close").hide(); },       
            buttons: {
                "Continue using Website?": function() {
                    StopCountDown();

                    $.ajax({
                        type: "GET",
                        url: "RefreshSession.aspx",
                        cache: false
                    });

                    $(this).dialog("close");

                    timeoutPolled = 0;
                    StartPollTimer();
                },
                "Logout": function() {
                    Logout();
                }
            }
        });

        $("#timeoutDialog").dialog("open");

        countDownCounter = 61;

        CountDown();
    }
    else {
        StartPollTimer();
    }
}

function CountDown() {
    if (stopCountDown) {
        stopCountDown = false;
    }
    else {
        countDownCounter--;
        $("#countdownTimer").html(countDownCounter);

        if (countDownCounter > 0) {
            setTimeout(CountDown, 950);
        }
        else {
            Logout();
        }
    }
}

function StopCountDown() {
    stopCountDown = true;
}

function Logout() {
    window.location.href = 'Logout.aspx';
}
Run Code Online (Sandbox Code Playgroud)