当用户会话到期时,或者请求在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(); } } });