【发布时间】: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