当用户会话过期或请求终止于302时,您如何处理AJAX请求

问题描述

| 已经提出了其他类似的问题,但是它们并没有倾向于处理通用的多用途解决方案。他们倾向于只处理用户身份验证问题。有时302在其他情况下有效。 那么,如何为ajax请求创建通用302处理程序,同时又为应用程序中的其他任何功能保持功能?     

解决方法

        最后,我们想出的解决方案有些笨拙,但看起来很优雅。 首先拦截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能够检测到重定向,然后将用户定向到请求的页面。     ,        看来您可以只添加一个条件来检查该特定状态。如果request是您的XMLHttpRequest对象,则在readyState为4时另外检查状态:
if(request.readyState == 4){
  if(request.status == 302) {
    doSomething();
  }
  else {
    doSomethingElse();
  }
}
编辑: 或者,或者,如果您不想使用直接的javascript(出于公平考虑,您确实将其标记为jquery-ajax),则如下所示:
$.ajax({
  statusCode: {
    302: function() {
      doSomething();
    }
  }
});
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...