9

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

这个话题讨论得不多——我看到的唯一问题是使用 asp.net 会员资格——我不使用

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

此会话将更新为当前时间

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

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

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

我使用这样的东西:

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

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

每个 ajax 返回事件或事件 - 我在javascriptpage load激活:分钟(20-1=19)。(当然 - 取消所有 prev setIntervals...)setInterval[sessionTime-1]

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

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

问题 :

1)如果用户没有在警告 div 上按任何内容,我将如何(在显示 div 1 分钟后)将他注销?我应该在显示 div 时打开 1 分钟的 setTimeout 然后(如果没有按下)将他注销吗?

2)这是正确的做法吗?

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

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

4

2 回答 2

5

Royi,要回答你的两个问题,我会说是。我已经多次构建了这些(通常使用 Forms Auth),但基本上你有一个倒计时以显示第一个警告的计时器,然后是另一个倒计时并让用户 X 秒回答的计时器。我通常将 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';
}
于 2012-10-02T18:07:51.237 回答
1

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

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

至于 cookie,如果您没有更改会话状态的默认设置,听起来您已经在使用了 - 我认为它被称为 .ASPNET 但我可能错了,您可以使用代理工具进行检查。

于 2012-10-02T18:31:59.073 回答