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

已经提出了类似的其他问题,但它们并不倾向于处理通用的多用途解决方案。 他们倾向于只处理用户身份validation问题。 有时302对其他情况有效。

那么如何为ajax请求创建通用的302处理程序,同时保持应用程序中任何其他内容的function?

我们最终提出的解决方案是有点hacky但看起来很优雅。

首先拦截来自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(); } } });