【问题标题】:Jquery Redirect inmediatly after Session Timeout会话超时后立即重定向 Jquery
【发布时间】:2016-09-13 20:02:01
【问题描述】:

我在 ASP.NET MVC 中有一个网站,我想在会话超时后自动重定向到登录页面,而无需用户干预。例如像 gmail 那样。

现在我正在对控制器进行 ajax 调用,以每隔 5 秒检查一次会话。

[HttpPost]
        public JsonResult CheckSession(string currentUrl)
        {
            bool result = false;
            Uri url = new Uri(currentUrl);
            if (PublicUrl.Contains(url.AbsolutePath))
            {
                result = true;
            }
            else
            {
                result = HttpContext.User.Identity.IsAuthenticated;
            }
            return Json(result);
        }

如果结果为假,我会在 JQuery 上进行重定向。

如果我手动删除浏览器上的 cookie,效果会很好。但问题是会话永远不会过期,因为我每 5 秒调用一次服务器,所以会话超时会在每次服务器端调用时重置。

如何在会话到期时自动重定向?

【问题讨论】:

  • 这里有两个不同的关注点:服务器会话超时,以及客户端对服务器会话超时的感知。

标签: jquery asp.net ajax asp.net-mvc session


【解决方案1】:

这里有几个单独的问题:服务器会话超时,客户端对服务器会话超时的感知,以及对用户不活动的处理。

1) 您如何在服务器端实现会话超时?
2)由于您通过心跳(每 5 秒)保持会话处于活动状态,因此您可能永远不会在服务器上达到会话超时。

您只能在客户端进行管理,方法是在达到超时值后使用 JavaScript 进行注销调用。使用 window.setTimeout() 在客户端设置不活动超时。当计时器触发时,将浏览器重定向到注销控制器或 sessionExpired 控制器(您的选择)。使用 beforeUnload 事件清除计时器,并在页面加载时设置一个新计时器。

然后,让服务器超时值来处理用户关闭浏览器和心跳停止的情况。

摘自 web.config 将我的会话超时定义为 20 分钟:

  <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="20" slidingExpiration="true" protection="All" name="ilApp" requireSSL="false" defaultUrl="~/Account/Login" />
   </authentication>
   <sessionState timeout="20" />

以及我添加到 /Shared/_Layout.cshtml 的 javascript 代码,因为该文件包含在我网站上的每个页面中:

    @* Redirect browser to session expiration page on timeout *@
    @{
        var authenticationSettings = System.Configuration.ConfigurationManager.GetSection("system.web/authentication") as System.Web.Configuration.AuthenticationSection;
    }
    <script type="text/javascript">
        $(document).ready(function () {
            function ilSessionTimeout() {
                window.location = '@Url.Action("SessionExpired", "Account", new { area = "" })';
            };
            function ilSessionTimeoutWarning() {
                $.jGrowl('You will be logged off soon due to inactivity.', { sticky: true, theme: 'growl-warning', header: 'Attention' });
            };
            // remember our timers so we can cancel when we unload this page and reset them on the next page load
            var g_pageTimer = window.setTimeout(ilSessionTimeout, @authenticationSettings.Forms.Timeout.TotalMilliseconds);
            var g_pageTimerWarning = window.setTimeout(ilSessionTimeoutWarning, Math.round(@authenticationSettings.Forms.Timeout.TotalMilliseconds*0.8));
            // clean up anything that needs cleaning before we leave this page
            window.onbeforeunload = function(e) {
                // clear the timers
                window.clearTimeout(g_pageTimer);
                window.clearTimeout(g_pageTimerWarning);
            };
        });
    </script>

这会设置两个计时器,一个用于会话超时期限(基于 web.config 中定义的值),另一个用于 80% 到期时使用 jGrowl 显示警告消息。我在 javascript 全局变量 (g_pageTimer*) 中为 unload 事件保留了两个计时器的句柄。

我连接到 window.onbeforeunload 以确保在页面即将更改时取消计时器。没有这个,无论客户端活动如何,超时都是绝对重定向到注销。

当超时计时器触发时,我会重定向到我网站上的一个页面 /Account/SessionExpired,该页面会向用户显示一条消息,然后完成注销。在我的示例中,我使用的是 ASP.Net Identity 2,但无论您在注销期间通常做什么,都可以在此处执行。

    // 
    // GET: /Account/SessionExpired
    [AllowAnonymous]
    public ActionResult SessionExpired()
    {
        try
        {
            System.Web.HttpContext.Current.Session.RemoveAll(); // Remove all session variables that we used
            AuthenticationManager.SignOut();
        }
        catch
        {
            // do nothing
        }

        return View();
    }

【讨论】:

  • 我正在使用 web.config 来设置服务器会话超时。在卸载事件之前重置计时器是什么意思?
  • 好问题。我添加了一些代码来澄清我的答案。
  • 感谢您的澄清。这太清楚了。最后你这是什么意思? "那么,让服务器超时值处理用户关闭浏览器心跳停止的情况"
  • 随着您的 ajax 心跳每 5 秒(或任何周期性)运行一次,服务器不会超时,直到客户端停止心跳。然后在您的服务器超时期限之后,服务器将超时。在我的示例中,您让客户端计时器(通过 javascript)导致不活动超时(在我的示例中,它仅由页面加载活动驱动。您可能希望添加其他重新启动计时器的事件,例如 keydown 或鼠标)。而且,如果用户关闭浏览器(在这种情况下心跳停止并且计时器被清除),服务器仍然会超时。
  • 好的。我不太了解您,因为我正在考虑删除我的心跳,因为它是为了检查会话而完成的,但是根据您的想法,这对我来说没有必要。如果 window.timeout 触发,我将调用服务器,如果用户关闭浏览器,会话将像往常一样被服务器关闭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 2013-06-08
  • 2015-07-18
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多