12

我使用以下内容来捕获未经授权的访问并强制登录:

$.ajaxSetup({
    statusCode: {
        401: function(){
            //do stuff
        }
    }
});

效果很好......当访问我的服务器(域)上的资源时,但现在我试图通过 ajax 调用使用第 3 方 API 资源,并且它们的 401 也被此捕获。那么,我怎么能:

  1. 重写上面的代码以仅从我的域中捕获 401,或者
  2. 对上述代码进行 $.ajax() 调用(使用不同的错误处理程序)

非常感谢!

4

3 回答 3

14

通过实验,我找到了答案。$.ajaxSetup() 基本上为任何 $.ajax() 请求设置默认值。但是,可以针对特定请求覆盖全局设置,如下所示:

$.ajaxSetup({
    statusCode: {
        401: function(){
            //this will catch any and all access denied errors
        }
    }
});

$.ajax({
    type: 'GET',
    dataType: 'json',
    url: someresouceurl,
    statusCode: {
        401: function(){
            //except this one!
        }
    },
    success: function(data) {
    }
});
于 2012-07-12T13:41:23.613 回答
1

在您的 401 函数中扩展@MrOBrian 的答案,this设置为包含有关 AJAX 请求的信息的设置对象。属性之一是url。您可以阅读此内容,并检查它是否是您的 URL。

$.ajaxSetup({
    statusCode: {
        401: function(){
            var url = this.url;
            if(url === myurl){ // check if url is yours
            }
            else{
                // not your URL, do nothing
                return;
            }
        }
    }
});
于 2012-07-12T14:03:57.723 回答
0

来自 jQuery API

If the request is successful, the status code functions take the same parameters as the success callback; if it results in an error, they take the same parameters as the error callback.

我建议查看您获得的 jqXHR 参数,看看您是否可以将其缩小到您的域,但我对 jQuery 的这方面了解不足,无法为您提供准确的代码。

于 2012-07-11T20:26:22.413 回答