【问题标题】:Implement auto log-out + warning in asp.net + jquery?在asp.net + jquery中实现自动注销+警告?
【发布时间】:2012-09-23 15:05:18
【问题描述】:

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

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

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

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

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

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

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

我用这样的东西:

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

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

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

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

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

问题:

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

2) 这是正确的做法吗?

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

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

【问题讨论】:

    标签: c# php javascript jquery asp.net


    【解决方案1】:

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

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

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

    【讨论】:

    • 这将是不持久的 cookie,aspnet_sessionid 但我在想像存储时间之类的东西......我仍然不明白为什么其他请求会被阻止?我没有提醒不显示 div :-)
    【解决方案2】:

    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';
    }
    

    【讨论】:

    • 你到底是怎么这么快读完我的问题的 :-) 你肯定读过不止一次 :-)
    • mmmm.. 所以我的思维方式是正确的....对吗?请注意我的第三个问题:-)
    • 是的,我会说你绝对是在正确的轨道上。我添加了一些代码和对您的第三个问题的回复。我实际上设置了一个 1 秒计时器,它在 19 分钟倒计时后被调用 60 次,这样我就可以更新一个显示倒计时剩余秒数的跨度。
    • 它看起来不是完美的解决方案,似乎这里缺少一些 sn-p 代码。
    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2012-06-04
    相关资源
    最近更新 更多