【问题标题】:How would you overcome this issue? Jquery + ajax + server timeout你将如何克服这个问题? Jquery + ajax + 服务器超时
【发布时间】:2010-06-21 20:38:40
【问题描述】:

我正在使用 asp.net mvc、C# 和 jquery。我的网站大量使用 ajax。这导致了一个问题,我不确定如何修复它(比我目前的解决方案更好地修复它)。

情景。

  1. 用户登录到我的网站 - cookie 集,服务器超时 30 分钟
  2. 用户离开 30 分钟
  3. 用户返回并单击我启用 ajax 的一个 jquery 选项卡
  4. 请求发送到服务器
  5. 服务器不工作,用户超时将他们发送回登录页面。
  6. 因为它是一个 ajax 请求,所以重定向会在选项卡中呈现。它看起来很难看(整个页面呈现在一个选项卡中),此时用户可能非常困惑。

问题

  1. 就服务器和 ajax 而言,ajax 请求是有效的,并且成功响应被发回。所以我不能去检查错误,因为请求是成功的,只是没有返回正确的数据。

解决方案 1

  1. 用户登录网站。
  2. Jquery ajax 请求找出用户超时
  3. 超时比服务器超时少 60 秒
  4. 一旦遇到 javascript 端的超时。 Jquery 对话框出现并告诉他们他们的会话已过期并强制他们重定向以登录包。
    • 用户不能点击任何东西,因为对话框会阻止它。如果某些用户使用 firebug 或其他东西可以将其删除,但服务器超时仍然有效,他们会得到丑陋的版本(那就不用管了)。
  5. 如果用户发出 ajax 请求,服务器端的超时将被重置,客户端的超时也会被重置。

问题

  1. 用户可能会走开,另一个人可能会来,并且超时消息可能会出现,但他们仍有可能在 45 秒内尝试发出新请求并重置超时。这个很低,不用太担心。

  2. 有时我观察到它只是超时(客户端),我不知道为什么。我永远无法重现问题(似乎发生在其他人身上,但不是在我测试时)。所以我猜有些东西没有写或者其他地方出错了。

所以第 2 点确实是我想要找到另一个解决方案的重要原因。

解决方案 2(推测)。

我在想,如果我可以制作自己的响应标头或其他东西,那么如果服务器超时,那么我可以发送一些 303 重定向或类似性质的东西,我可以检查然后基于此进行 jquery 重定向。

但是我不确定在我的 C# 代码中在哪里执行此操作,或者我是否可以执行类似操作。

【问题讨论】:

  • 我将其写为评论,因为我的解决方案非常简单,以至于我感觉我没有理解这个问题。当您从服务器发送响应时,包括信息(在 json 中)是否会话过期。客户端部分将在放入 div 之前对其进行检查。如果过期 => 重定向到登录页面
  • 好吧,问题是它永远不会到达发送我的任何 json 的部分。就像服务器超时一样,它仍然不会继续执行操作方法然后阻止它。它在进入方法之前阻止它。所以我不能在那里设置任何东西。

标签: c# jquery asp.net-mvc


【解决方案1】:

您始终可以在 LogOn 操作中添加自定义 HTTP 标头,该标头可能会被 AJAX 调用拦截并采取相应措施:

public ActionResult LogOn()
{
    Response.AddHeader("X-LOGON", "LogOn");
    return View();
}

并在成功回调中检查此标头的存在:

$.ajax({
    url: '/home/someaction',
    success: function (data, textStatus, XMLHttpRequest) {
        if (XMLHttpRequest.getResponseHeader('X-LOGON') === 'LogOn') {
            // the LogOn page is being displayed 
            // probably timeout or unaithorized => act accordingly
        }
    }
});

【讨论】:

  • 在全局 ajax 处理程序中可能会更好——这样您就不必到处检查它了。我不喜欢的一点是,用户可能会花费大量时间做某事,结果却将其清除,因为它是在会话到期后提交的。我更愿意在事件发生之前警告他们,让他们采取一些措施来避免它。
  • @tvanfosson,是的,好主意,$.ajaxSetup 看起来是一劳永逸的好地方。
  • @tvanfosson,所以您定期轮询服务器以检测身份验证票证是否仍然有效?
  • 是的,我有点同意 tvanfosson 的观点,如果用户超时,它应该会显示一条消息说他们被警告了。但是我不知道 2 分钟的警告之类的。就像我说的,一旦用户访问我的页面,它就是所有 ajax。所以即使他们回来了,还有 30 秒的时间想要做点什么。要做到这一点,将是一个 ajax 请求。但我认为应该出现一个对话框而不是自动直接显示他们超时。现在有了 $.ajaxSetup,你能告诉我该怎么做吗?我试着做了一个,但它不起作用。
  • 还有达林我猜没有办法让授权标签发回303重定向?另外,为什么要制作自己的标头而不设置 303 重定向?这是为了避免潜在的冲突吗?
【解决方案2】:

我不明白为什么您的身份验证处理程序(操作过滤器)无法通过返回 403(禁止)来处理此问题,然后 AJAX 处理程序将通过将 window.location 设置为 /login 来处理。

【讨论】:

  • 这正是身份验证处理程序所做的,问题是这被 ASP.NET 引擎拦截并重定向到登录页面 => jQuery 看到的只是登录页面的 200 状态代码。
  • 那么达林你知道吗?我可以让它与他的 403 或 303 或非 200 保持一致吗?
  • 这就是我说“您的身份验证处理程序/过滤器”的原因。创建您自己的 AuthorizeAttribute 并覆盖 OnAuthorization 以返回 ForbiddenResult。这是 ASP.NET MVC,你可以为所欲为。我实际上使用了我描述的技术。
【解决方案3】:

我基本上做解决方案1,除了(1)我已经将它封装到一个插件中,(2)我在页面呈现时将会话超时注入。您可以在我的博客http://farm-fresh-code.blogspot.com 中查看详细信息,在此article 中。一个补充是,当客户端超时时,它会自动调用注销操作来实际终止会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2021-12-25
    • 2011-08-16
    • 1970-01-01
    相关资源
    最近更新 更多