我有一个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();
}
答案 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);
}