Возможны исключения jQuery для глобальных $.ajaxSetup()?

Я использую следующее, чтобы поймать несанкционированный доступ и заставить логин:

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

Прекрасно работает... при доступе к ресурсам на моих серверах (доменах), но теперь я пытаюсь использовать ресурсы сторонних API через аякс-вызовы, и их 401 также пойманы этим. Итак, как я могу:

  • перепишите вышеприведенный код, чтобы поймать только 401 из моего домена или
  • сделать вызов $.ajax() с исключением из вышеприведенного кода (используйте другой обработчик ошибок)

Спасибо большое!

Ответ 1

Через эксперименты я обнаружил ответ. $.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) {
    }
});

Ответ 2

Расширяясь в ответе @MrOBrian, в вашей функции 401 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;
            }
        }
    }
});

Ответ 3

Из API jQuery

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, чтобы дать вам точный код.