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

前端之家收集整理的这篇文章主要介绍了jquery – 如何通过JavaScript检测MVC 3会话到期前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个MVC 3站点,会话超时为2分钟. @H_301_2@如果用户在2分钟内没有与页面交互,则应在2分钟点击后自动转发到登录屏幕(而不是在2分钟后进行交互).

@H_301_2@每当用户在会话仍处于活动状态时与页面交互时,会话超时需要重置为该时间的2分钟.

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

@H_301_2@当前实施中的问题是,会话有效的时间超过2分钟存在漏洞.
例如:
用户在12:00登录(会话应在12:02到期)
– 在12:01,用户页面进行交互
调用更新会话,将会话超时重置为2分钟(会话应在12:03到期)
– 在12:02,第一次checkSession()运行并返回有效,checkSession()设置为在12:04再次运行
– 会话仍应在12:03到期,但不会因为checkSession()也在更新会话超时
– 如果用户在12:04之前没有与网站交互,checkSession()将运行并关闭用户,但是,自上次用户活动以来已经过了3分钟

@H_301_2@我的初始解决方案是在调用renewSession()时调用setTimeout(checkSession,120000),但是由于checkSession()更新了会话,因此它会永久保持活动状态.

@H_301_2@反正有没有阻止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",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();
}

解决方法

var checkTimeout;

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

function checkSession() {
    $.ajax({
        url: "/Account/CheckIfSessionValid",complete: function () {
            setupSessionTimeoutCheck();
        }
    });
}

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

猜你在找的jQuery相关文章