我有asp.net mvc应用程序,我想在用户空闲20分钟时强制自动注销。 此外,如果用户在浏览器上移动鼠标,我想保留他的会话超时。 为此,我编写了代码
<body onload="StartTimers();" onmousemove="ResetTimers();">
</body>
<script type="text/javascript">
var timoutNow = @Session.Timeout*60000; // Timeout in 2 mins.
var timeoutTimer;
// Start timers.
function StartTimers() {
// warningTimer = setTimeout("IdleWarning()", timoutWarning);
setTimeout("IdleTimeout()", timoutNow);
$.get("@Url.Action("ResetSession", "Home")", function () {
// debugger
timoutNow = @Session.Timeout*60000; // Timeout in 2 mins.
// debugger
setTimeout("IdleTimeout()", timoutNow);
});
}
// Reset timers.
function ResetTimers() {
clearTimeout(timeoutTimer);
StartTimers();
}
// Logout the user.
function IdleTimeout() {
window.location =path + "/Home/Logout" + window.location.search;
}
</script>
服务器端:
public void ResetSession()
{
Session.Timeout = 1;
}
但问题是,即使用户在浏览器中不断移动鼠标,它也会在给定时间后重定向到注销。
答案 0 :(得分:0)
因为您还没有在窗口上定义任何事件。将其添加到您的代码中:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>
<div id='test'>Select text, it'll copy on mouse up</div>
<div id='test2'>Copy text using ctrl-c</div>
<div id='test3'>Click here to copy text</div>
<div id='ta'><textarea cols="40" rows="5" placeholder="Test pasting here"></textarea></div>
&#13;
答案 1 :(得分:0)
这里有很多事情需要注意:
会话超时正在滑动。任何用户与服务器的交互都将阻止会话超时。换句话说,您只需要向服务器发出请求;没有必要使用该请求显式修改会话超时。
身份验证超时是绝对的。在您的身份验证配置中,您可以自定义身份验证应处于活动状态的时间。当超过该时间量或默认金额时,用户将取消身份验证,无论他们是否正在积极使用该网站。
会话和身份验证都是基于cookie的,也就是说有一个客户端组件。服务器不能直接使用户计算机上的会话或身份验证无效。它只能使服务器上的那些无效。这意味着客户端在发出新请求之前不会受到影响。只有在这一点上,他们的cookie才会失效,并且会分配一个新的会话,或者提示他们重新进行身份验证。
鉴于此,如果您希望在身份验证过期时将用户重定向到登录页面 ,则必须设置客户端计时器来跟踪此情况。当客户端计时器到期时,您可以在客户端通过location.href
手动重定向到登录页面,并且由于此时用户的身份验证实际上已经过期,因此应该是无缝。棘手的部分是你还需要在页面视图中保留这个特定的计时器,因为它再次是绝对的。换句话说,如果用户在页面上花了10分钟,并且他们的身份验证在20分钟后过期,则下一页面视图的计时器需要从10分钟开始,而不是20分钟。您可以使用localStorage。此外,由于身份验证的超时是绝对的,因此用户正在积极使用该站点,因此无法取消发生这种情况。如果您需要执行类似的操作,则必须将auth超时设置为可笑的大小,以便用户的auth在单次访问您的网站时实际上永不过期。然后,如果用户空闲,您可以使用客户端计时器向您的注销操作发送AJAX请求。
用于重置会话超时的AJAX应该很好,因为通过AJAX发送请求足以重置会话超时。但是,您当前正在每次鼠标移动时发送AJAX ,这意味着您有效地向您的服务器发送垃圾邮件。你应该明显地限制它,这样只有在几分钟内没有发送一个新的AJAX请求时,它将在mousemove上发送。只要您在会话超时之前的一段时间内发送至少一个请求,它实际上永远不会超时,因此在大多数情况下,没有必要每秒或甚至每分钟发送一次请求。