【问题标题】:How To Detect MVC 3 Session Expiration via JavaScript如何通过 JavaScript 检测 MVC 3 会话过期
【发布时间】:2014-10-15 11:35:22
【问题描述】:

我有一个会话超时为 2 分钟的 MVC 3 站点。

如果用户在 2 分钟内未与页面交互,则应在 2 分钟点击后立即自动转发到登录屏幕(而不是在 2 分钟后交互时)。

只要用户在会话仍处于活动状态时与页面进行交互,会话超时就需要从那时起重置为 2 分钟。

我们目前的实现如下(源码如下):
1.用户登录时调用setTimeout(checkSession, 120000)
2.当用户与页面交互时,调用renewSession()
3. checkSession()运行后,调用setTimeout(checkSession, 120000)

当前实现中的问题是,存在会话有效期超过 2 分钟的漏洞。

例如:
- 用户在 12:00 登录(会话应在 12:02 到期)
- 在 12:01,用户与页面交互
- 调用更新会话,将会话超时重置为 2 分钟(会话应在 12:03 到期)
- 在 12:02,首先 checkSession() 运行并返回有效,checkSession() 设置为在 12:04 再次运行
- 会话仍应在 12:03 到期,但不会因为 checkSession() 也在更新会话超时
- 如果用户在 12:04 之前没有与站点交互,则 checkSession() 将运行并注销用户,但是,距离上次用户活动已经 3 分钟

我最初的解决方案是在调用 renewSession() 时调用 setTimeout(checkSession, 120000),但由于 checkSession() 会更新会话,这使它永远保持活动状态。

有没有办法阻止 checkSession 更新会话,或者有人可以指出一个更好的解决方案来完成这个吗?

$(document).ready(function() {
    setTimeout("checkSession();", 60000);

    $("body").mouseup(function () {
        renewSession();
    });

    $("input").blur(function () {
        renewSession();
    });

    $("input").focus(function () {
        renewSession();
    });
});

function checkSession() {
    $.ajax({
        url: "/Account/CheckIfSessionValid",
        type: "POST",
        success: function (result) {
            if (result == "False") {
                window.location = "/Account/LogOff";
            }
        },
        complete: function () {
            setTimeout("checkSession();", 60000);
        }
    });
} 

function renewSession() {
    $.ajax({
        url: "/Account/RenewSession",
        type: "POST",
        data: {
            __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val()
        }
    });
}

public ActionResult CheckIfSessionValid()
{
    if (Session["GoldenTicket"] == null)
    {
        Session.RemoveAll();
        Session.Abandon();
        FormsAuthentication.SignOut();
        return Json("False");
    }

    return Json("True");
}

[HttpPost]
[ValidateAntiForgeryToken]
public void RenewSession()
{
    Session["GoldentTicket"] = "True";
}


protected void Session_End(object sender, EventArgs e)
{
    Session.Clear();
    Session.Abandon();
    Session.RemoveAll();
}

【问题讨论】:

  • 使用变量并将其设置为setTimeout 调用。然后在checkSession 中,使用clearTimeout([var]) 清除超时,然后再将变量设置为新的setTimeout 调用。
  • @entropic 知道这很简单,谢谢先生!!

标签: jquery asp.net-mvc-3 session-timeout


【解决方案1】:
var checkTimeout;

$(document).ready(function () {
    checkTimeout = setTimeout(checkSession, 900000);
});

function checkSession() {
    $.ajax({
        url: "/Account/CheckIfSessionValid",
        type: "POST",
        success: function (result) {
            if (result == "False") {
                window.location = "/Account/LogOff";
            }
        },
        complete: function () {
            setupSessionTimeoutCheck();
        }
    });
}

function setupSessionTimeoutCheck() {
    clearTimeout(checkTimeout);
    checkTimeout = setTimeout(checkSession, 900000);
}

【讨论】:

  • AJAX 调用不会扩展会话吗? 自上次请求后以配置的时间间隔发生会话超时。
  • @JohnWu 在 ASPNET Core 中,您可以将 Cookie SlidingExpiration 设置为 false
猜你喜欢
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2013-09-06
  • 2010-09-05
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多