C# 当用户会话过期时,或者当请求在302中终止时,如何处理AJAX请求
也有人问过其他类似的问题,但它们并不倾向于处理通用的多用途解决方案。他们倾向于只处理用户身份验证问题。有时302适用于其他情况C# 当用户会话过期时,或者当请求在302中终止时,如何处理AJAX请求,c#,ajax,session,jquery,redirect,C#,Ajax,Session,Jquery,Redirect,也有人问过其他类似的问题,但它们并不倾向于处理通用的多用途解决方案。他们倾向于只处理用户身份验证问题。有时302适用于其他情况 那么,如何为ajax请求创建一个通用的302处理程序,同时维护应用程序中其他任何内容的功能呢?似乎您可以添加一个条件来检查特定状态。如果请求是XMLHttpRequest对象,则在readyState为4时另外检查状态: if(request.readyState == 4){ if(request.status == 302) { doSomething(
那么,如何为ajax请求创建一个通用的302处理程序,同时维护应用程序中其他任何内容的功能呢?似乎您可以添加一个条件来检查特定状态。如果请求是XMLHttpRequest对象,则在readyState为4时另外检查状态:
if(request.readyState == 4){
if(request.status == 302) {
doSomething();
}
else {
doSomethingElse();
}
}
编辑:
或者,如果您不想使用纯javascript(因为公平地说,您确实将其标记为jquery ajax),那么如下所示:
$.ajax({
statusCode: {
302: function() {
doSomething();
}
}
});
似乎您可以添加一个条件来检查该特定状态。如果请求是XMLHttpRequest对象,则在readyState为4时另外检查状态:
if(request.readyState == 4){
if(request.status == 302) {
doSomething();
}
else {
doSomethingElse();
}
}
编辑:
或者,如果您不想使用纯javascript(因为公平地说,您确实将其标记为jquery ajax),那么如下所示:
$.ajax({
statusCode: {
302: function() {
doSomething();
}
}
});
我们最后提出的解决方案有点老套,但看起来相当优雅 首先,在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能够检测重定向,然后将用户引导到请求的页面。我们最终提出的解决方案有点老套,但看起来相当优雅 首先,在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能够检测重定向,然后将用户引导到请求的页面。至少就我所检查的而言,该解决方案似乎存在问题,因为302由浏览器处理,当jquery获得状态代码时,它实际上不是302,但是设置为0可能会有帮助:您无法使用
statusCode
捕获302。在jQuery访问它之前,它由浏览器的JavaScript引擎处理,因此最终会得到一个200(或其他)和重定向的响应。这个解决方案似乎确实存在问题,至少据我所查,因为302是由浏览器处理的,当jQuery获得状态码时,它实际上不是302,但是设置为0可能会有帮助:您无法使用statusCode
捕获302。在jQuery访问它之前,它由浏览器的JavaScript引擎进行处理,因此最终得到200(或其他)和重定向响应。