【问题标题】:How to prevent AJAX polling keeping Asp.Net sessions alive如何防止 AJAX 轮询使 Asp.Net 会话保持活动状态
【发布时间】:2014-12-16 19:30:06
【问题描述】:

我们有一个 ASP.Net 应用程序,它的会话(和 cookie)有 20 分钟的滑动到期时间。 但是,我们有一些 AJAX 正在轮询服务器以获取新信息。这样做的缺点当然是会话将无限期地继续,因为它被轮询调用保持活动状态,导致到期时间被刷新。有没有办法防止这种情况 - 即只允许在非 ajax 调用上刷新会话?

关闭滑动到期并不是一个真正的选择,因为这是一个业务用户将在电话之间的大部分时间里使用的应用程序。

关于此讨论的其他 Stackoverflow 讨论关于维护 2 个单独的应用程序(一个用于经过身份验证的调用,一个用于未经身份验证的调用。我不确定这是否是一个选项,因为所有调用都需要经过身份验证。

有什么想法吗?

【问题讨论】:

  • +1! this 是否提供了一些想法?
  • 您可以尝试禁用请求的会话状态:codeproject.com/Articles/201879/…
  • 澄清一下——我们想要实现的是,如果用户没有与页面交互,则允许会话在 20 分钟后过期——即会话不会因为以下原因而保持活动状态ajax 轮询。
  • 你可以试试这个解决方案,将会话超时和登录时间添加到本地存储中,并在javascript头部检查用户是否超过超时

标签: ajax asp.net-mvc session cookies


【解决方案1】:

我通过在 i-Frame 中创建一个隐藏页面来做到这一点。然后使用 JavaScript 它每 18 分钟回发一次以保持会话处于活动状态。这真的很好用。

此示例来自 ASP.NET Forms 项目,但可以针对 MVC 进行调整。

  1. 创建一个名为 KeepSessionAlive 的页面并添加一个元刷新标签

    meta id="MetaRefresh" http-equiv="refresh" content="21600;url=KeepSessionAlive.aspx"

  2. 在后面的代码中

    受保护的字符串 WindowStatusText = "";
    protected void Page_Load(object sender, EventArgs e)
    {
        //string RefreshValue = Convert.ToString((Session.Timeout * 60) - 60);
    
        string RefreshValue = Convert.ToString((Session.Timeout * 60) - 90);
    
        // Refresh this page 60 seconds before session timeout, effectively resetting the session timeout counter.
        MetaRefresh.Attributes["content"] = RefreshValue + ";url=KeepSessionAlive.aspx?q=" + DateTime.Now.Ticks;
    
        WindowStatusText = "Last refresh " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
    }
    
  3. 在母版页中添加隐藏的 iFrame

    iframe ID="KeepAliveFrame" src="KeepSessionAlive.aspx" frameBorder="0" width="0" height="0"

Download example

【讨论】:

  • 这不与所要求的相反吗? =)
  • 一开始我是这么认为的,但问题的最后一部分是“......有没有办法防止这种情况 - 即只允许在非 ajax 调用上刷新会话?”
  • 是的,恰恰相反——感谢阿托凯。请参阅我上面的评论。
【解决方案2】:

由于这个问题很老,我假设它已经解决或实施了解决方法。但是,我想提一下,我们使用 SignalR 代替 AJAX 轮询服务器以执行操作,它允许客户端通过 JQuery 与服务器通信和/或服务器通知客户端。

查看:Learn About ASP.NET SignalR

【讨论】:

    【解决方案3】:

    将以下代码添加到您作为轮询参考的控制器操作中。将其转换为一个属性,以便它可以在任何地方使用。此行不会延长会话超时

        [HttpPost]
        public ActionResult Run()
        {
            Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
    
            return Json("");
        }
    

    【讨论】:

    • 这会导致用户注销并需要重新登录对吗?这就是问题想要避免的。
    【解决方案4】:

    没有办法阻止 ajax 使会话和 cookie 保持活动状态!

    但是,有一种方法可以实现您想做的事情。也就是说,如果我将描述的过程对你来说是可以的。

    我认为您真正想要实现的是首先使用 ajax 刷新页面,以便某些进程处于活动状态并运行。还可以知道用户何时停止操作程序。

    如果这是您想要的,那么有一个简单的过程可以实现这一目标

    1. 您将让 ajax 运行您想要运行的东西。
    2. 您将删除要检查用户是否已停止页面操作的会话,并将会话作为变量进行管理。
    3. 该变量可以是全局变量或类变量,只要用户单击页面上的元素,该变量就会被设置为初始值。 (您将选择一个元素的点击事件并将变量设置为初始值)
    4. 您将在每次给定时间(例如每次运行 ajax 时)递增变量
    5. 您还将运行一个函数/方法来检查该变量的值是否大于您设置为限制的值。这可以在您每次运行 ajax 或每次您希望它运行时运行(定时事件)。
    6. 如果变量的值大于设置的限制,它应该使会话无效或清除会话/注销用户。

    这样,如果用户停止操作(单击元素)系统正在运行的任何页面上,最终将注销当前用户并停止运行程序。

    【讨论】:

      猜你喜欢
      • 2014-06-20
      • 1970-01-01
      • 2011-09-12
      • 2012-04-10
      • 2012-06-05
      • 2012-08-10
      • 2011-10-09
      • 1970-01-01
      • 2012-02-06
      相关资源
      最近更新 更多