如何通过JavaScript检测MVC 3会话到期

时间:2014-08-21 18:03:01

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

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

如果用户在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();
}

1 个答案:

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