【问题标题】:C# MVC Creating a timer based auto-logout with jquery?C# MVC 使用 jquery 创建基于计时器的自动注销?
【发布时间】:2011-09-11 07:19:03
【问题描述】:

如何创建一个 jquery 脚本以在一段时间不活动后自动注销用户?或者有没有一个jQuery插件可以做到这一点?它需要执行以下操作:

  1. 使用 setTimeout 创建计时器(例如 30 分钟)
  2. 每次用户与页面交互时重置超时
  3. setTimeout到期后,使用ajax调用服务器上的/logout动作(asp.net mvc)
  4. 显示一个模态/灯箱对话框,告诉用户再次登录

【问题讨论】:

  • 在服务器端管理它会不会更容易,然后一旦计时器到期,将它们重定向到带有模态/灯箱弹出窗口的页面?
  • 同意。即使这样,您确定要在固定时间后手动注销它们吗?表单身份验证票的到期(滑动到期)不是用于此目的吗?
  • @tim 我不知道该怎么做的主要部分是 #2 在任何用户操作后将计时器重置为 30 分钟。我将如何简明扼要地检测到任何操作?
  • @rpm 是的,表单身份验证确实可以做到这一点。但是会发生什么情况,如果用户空闲然后单击某些内容,则表单身份验证已过期并且他们被重定向到登录页面 - 他们说“wtf?我刚刚单击了保存按钮,为什么我必须登录?”所以这是一种让他们知道他们已经以更温和的方式退出的方式。
  • 您总是可以编写一个非常轻量级的 ajax 服务来轮询 MVC 以查看计时器是否已过期然后写入隐藏字段等。然后 javascript 可以监视此字段,如果它表示用户会话已过期,显示模态?你怎么看?如果您想在客户端完成所有操作并处理浏览器关闭等问题,这可能是我能想到的最简单的方法

标签: c# jquery asp.net-mvc timeout


【解决方案1】:

我知道这是一个非常古老的问题,但对于寻找类似解决方案以在用户闲置一段时间后注销用户的人来说可能很有用

http://www.dotnetfunda.com/articles/show/3130/automatically-logout-when-user-is-idle-for-sometime

链接可能会消失,所以这里是代码 -

<script>
    $(function () {
        $("body").on('click keypress', function () {
            ResetThisSession();
        });
    });



var timeInSecondsAfterSessionOut = 30; // change this to change session time out (in seconds).
    var secondTick = 0;

    function ResetThisSession() {
        secondTick = 0;
    }

    function StartThisSessionTimer() {
        secondTick++;
        var timeLeft = ((timeInSecondsAfterSessionOut - secondTick) / 60).toFixed(0); // in minutes
    timeLeft = timeInSecondsAfterSessionOut - secondTick; // override, we have 30 secs only 

        $("#spanTimeLeft").html(timeLeft);

        if (secondTick > timeInSecondsAfterSessionOut) {
            clearTimeout(tick);
            window.location = "/Logout.aspx";
            return;
        }
        tick = setTimeout("StartThisSessionTimer()", 1000);
    }

    StartThisSessionTimer();

【讨论】:

  • window.location = "/Logout.aspx";此行不适用于 MVC,而 artical 它本身适用于 ASP.Net。
  • 您可以将其替换为 - $.redirectPost('@Url.Action("LogOff", "Account")');
  • 我只是从链接中复制了代码(上面引用过)
  • @NareshRavlani,对于 mvc 使用 window.location = "/Home/LogOff";
【解决方案2】:

您需要在这里考虑几个不同的方面。首先,如果用户只是关闭了浏览器,或者用户使用的计算机死机了,会发生什么?如果用户在 30 分钟内访问了该页面,该用户是否仍处于登录状态?

假设用户无论如何都应该登录 30 分钟。最简单的方法是在身份验证 cookie 上设置 cookie 超时。请记住在每个页面刷新时更新超时。并使用 jQuery 计时器检查 cookie 是否仍然有效,或者只是跟踪用户登录时间。

所以,jQuery timers,你可以在每个页面加载刷新 cookie,然后检查计时器/延迟是否执行,如果是,删除 cookie 并显示一个模式框。

有很多方法可以做到这一点,使用计时器是一种方法。

$(this).oneTime(1800 , function() {
    location.href='/logout'; // redirects to logout page.
});

另一种方法是使用服务器端检查这个,但你不会得到这个模型框,正如我所说,有很多方法,这完全取决于你的喜好。

【讨论】:

  • 我只担心闲置。如果它们空闲 30 分钟,我只想自动调用 /logout 操作。所以使用页面加载没有用,因为当有人空闲时不会发生这种情况。
  • 我已经更新了答案。在当前的 jquery 中,当 30 分钟(1800 秒)过去后,您将被重定向到注销。如果你想要一个成熟的效果,看看 BlockUI (jquery.malsup.com/block)
  • 是的,但这不会在每次用户与页面交互时重新开始时间。相反,他们将每 30 分钟注销一次。必须在 30 分钟不活动之后。
  • 这取决于您的整个架构,如果用户以某种方式进行交互,您需要“重置”计时器。在我看来,“不活动”是指一旦处理了请求,直到开始新的请求。因此,一旦您开始一个新请求,请删除计时器并重新添加它。请参阅有关如何删除和/停止计时器的问题stackoverflow.com/questions/4806094/…
  • 我的应用程序中的大多数请求都是 ajax,因此页面加载很少。但是我确实有一个 .ajaxstart 方法可以用来检测“任何活动”
猜你喜欢
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多