如果在jquery mvc application

时间:2017-04-26 16:13:22

标签: jquery asp.net-mvc-5

我有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;

        }

但问题是,即使用户在浏览器中不断移动鼠标,它也会在给定时间后重定向到注销。

2 个答案:

答案 0 :(得分:0)

因为您还没有在窗口上定义任何事件。将其添加到您的代码中:

&#13;
&#13;
<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;
&#13;
&#13;

答案 1 :(得分:0)

这里有很多事情需要注意:

  1. 会话超时正在滑动。任何用户与服务器的交互都将阻止会话超时。换句话说,您只需要向服务器发出请求;没有必要使用该请求显式修改会话超时。

  2. 身份验证超时是绝对的。在您的身份验证配置中,您可以自定义身份验证应处于活动状态的时间。当超过该时间量或默认金额时,用户将取消身份验证,无论他们是否正在积极使用该网站。

  3. 会话和身份验证都是基于cookie的,也就是说有一个客户端组件。服务器不能直接使用户计算机上的会话或身份验证无效。它只能使服务器上的那些无效。这意味着客户端在发出新请求之前不会受到影响。只有在这一点上,他们的cookie才会失效,并且会分配一个新的会话,或者提示他们重新进行身份验证。

  4. 鉴于此,如果您希望在身份验证过期时将用户重定向到登录页面 ,则必须设置客户端计时器来跟踪此情况。当客户端计时器到期时,您可以在客户端通过location.href手动重定向到登录页面,并且由于此时用户的身份验证实际上已经过期,因此应该是无缝。棘手的部分是你还需要在页面视图中保留这个特定的计时器,因为它再次是绝对的。换句话说,如果用户在页面上花了10分钟,并且他们的身份验证在20分钟后过期,则下一页面视图的计时器需要从10分钟开始,而不是20分钟。您可以使用localStorage。此外,由于身份验证的超时是绝对的,因此用户正在积极使用该站点,因此无法取消发生这种情况。如果您需要执行类似的操作,则必须将auth超时设置为可笑的大小,以便用户的auth在单次访问您的网站时实际上永不过期。然后,如果用户空闲,您可以使用客户端计时器向您的注销操作发送AJAX请求。

    用于重置会话超时的AJAX应该很好,因为通过AJAX发送请求足以重置会话超时。但是,您当前正在每次鼠标移动时发送AJAX ,这意味着您有效地向您的服务器发送垃圾邮件。你应该明显地限制它,这样只有在几分钟内没有发送一个新的AJAX请求时,它将在mousemove上发送。只要您在会话超时之前的一段时间内发送至少一个请求,它实际上永远不会超时,因此在大多数情况下,没有必要每秒或甚至每分钟发送一次请求。