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

时间:2012-10-02 18:04:42

标签: c# php javascript jquery asp.net

许多网站(例如银行网站) - 在会话即将到期之前实施注销+ 1分钟警告。(20分钟)

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

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

此会话将在以下时间更新为当前时间

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

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

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

我使用这样的东西:

jQuery(document).ajaxStart(function(){
    gotoHandlerAndUpdateSessionTime();
})

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

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

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

我显示一个警告div,用户可以选择 exit stay

问题:

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

2)这是正确的做法吗?

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

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

2 个答案:

答案 0 :(得分: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';
}

答案 1 :(得分:1)

我可能不会告诉你任何你不知道的事情,但无论如何这里是我的两分钱 -

在没有按下警告按钮的用户上有两个区域:(1)当前显示在屏幕上的信息(2)阻止更多信息的其他请求 - 对于第一个,javascript计时器应该转发到LoggedOut页面如果没有被点击警告对话框的结果取消,对于第二个,肯定的服务器端逻辑应该检查当前请求是否在登录用户的上下文中。

对于cookies,如果您没有更改会话状态的默认设置,听起来就像您已经使用过的那样 - 我认为它被称为.ASPNET但是我可能错了,您可以使用代理工具进行检查。 / p>