当用户会话到期时,或者请求在302中终止时,如何处理AJAX请求

本文关键字:请求 AJAX 何处理 终止 处理 会话 用户 或者 | 更新日期: 2023-09-27 17:59:10

其他类似的问题也被问过,但它们往往不涉及通用的多用途解决方案。他们倾向于只处理用户身份验证问题。有时302对其他情况有效。

那么,如何为ajax请求创建一个通用的302处理程序,同时维护应用程序中其他任何东西的功能呢?

当用户会话到期时,或者请求在302中终止时,如何处理AJAX请求

我们最终提出的解决方案有点粗糙,但看起来相当优雅。

首先在global.asax文件中截取来自ajax查询的任何302。

protected void Application_EndRequest()
{
    var context = new HttpContextWrapper(Context);
if (Context.Response.StatusCode == 302 && context.Request.IsAjaxRequest())
    {
        Context.Response.Clear();
        Context.Response.StatusCode = 308;
    }
}

我们发明了一个状态代码308,这样浏览器就不会拦截302并导致jquery失败。

然后在javascript全局文件的某个位置添加以下

$(document).ajaxError(function (e, request, errorThrown, exception) {
    if (request.status == "308") {
        window.location = request.getResponseHeader('location');
    }
});

这使得jquery能够检测重定向,然后将用户引导到请求的页面。

您似乎可以添加一个条件来检查特定状态。如果请求是XMLHttpRequest对象,那么当readyState为4:时,还要检查状态

if(request.readyState == 4){
  if(request.status == 302) {
    doSomething();
  }
  else {
    doSomethingElse();
  }
}

编辑:

或者,如果您不想使用直接的javascript(因为公平地说,您确实将其标记为jquery ajax),那么如下所示:

$.ajax({
  statusCode: {
    302: function() {
      doSomething();
    }
  }
});