我有一个MVC 3站点,会话超时为2分钟.
如果用户在2分钟内没有与页面交互,则应在2分钟点击后自动转发到登录屏幕(而不是在2分钟后进行交互).
每当用户在会话仍处于活动状态时与页面交互时,会话超时需要重置为该时间的2分钟.
我们目前的实现如下(源代码如下):
1.当用户登录时,调用setTimeout(checkSession,120000)
2.当用户与页面交互时,请调用renewSession()
3. 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",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);
}