我有一个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更新会话,还是有人指出我有更好的解决方案来完成这个?
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); }