Подтвердить что ты не робот

Есть ли способ удалить заголовки Ajax, установленные setRequestHeader()?

Im пишет JS script, который живет в системе, которая теперь добавляет пользовательский заголовок XID ко всем запросам Ajax через jqXHR.setRequestHeader() в функции, зарегистрированной в jQuery.ajaxPrefilter().

В моем script мне нужно сделать запрос Ajax на сторонний сайт, чьи Access-Control-Allow-Headers не настроены, чтобы разрешить этот пользовательский заголовок XID.

Кажется, у меня есть 3 варианта:

  • Найдите способ удалить этот заголовок XID в функции $.ajax() s beforeSend, которую я подтвердил, вызывается после функции ajaxPrefilter().
  • Отказ от использования $.ajax() полностью и просто запись самого материала Ajax.
  • Указывает, что $.ajax() указывает на бэкэнд систем, который принимает пользовательский заголовок XID, и выполняет запрос на сторонний сайт через cURL.

Вариант № 1 является предпочтительным, если это простой способ сделать это, так как это будет самый чистый и быстрый маршрут. Просто не могу понять, как.

Я пробовал переопределить его так, но он не работал:

beforeSend: function(jqXHR, settings) {
    jqXHR.setRequestHeader('custom-xid-header', null);
}

Любые идеи?

4b9b3361

Ответ 2

Я понимаю, что это старый поток, но это все еще проблема! Надеюсь, что следующее поможет решить эту проблему для кого-то другого, как это имеет место для нас.

Настройка заголовка на null/undefined/"" после того, как он был установлен, не удаляет его, он отправляет заголовок все еще, но не имеет значения или "undefined" или "null". Это, вероятно, никогда не то, что вы хотите, и в нашем случае полностью удаляет SSO, когда он заголовок авторизации.

Решение, с которым мы столкнулись, зависит от сочетания предложения @marlar (спасибо) и другого недостатка jQuery: вы можете использовать только ОДИН beforeSend(), и любой новый крючок заменяет предыдущий. Похоже, что это также верно, если вы поставляете beforeSend() в конкретном запросе $.ajax() - он переопределит любой по умолчанию в $.ajaxSetup(). Поступая таким образом, вы запрещаете привязку по умолчанию к настройке заголовка. (Это не 100% идеально, потому что могут быть другие вещи, сделанные в стандартном beforeSend(), который тогда не произойдет, но эй).

Таким образом, это соответствует как статическим, так и динамически настроенным заголовкам для конкретного запроса:

if($.ajaxSettings && $.ajaxSettings.headers) {
    delete $.ajaxSettings.headers.Authorization;
}
$.ajax({
    beforeSend: function() {}, // no op
    // ...
});

Вы не можете сделать то же самое для prefilter(), но я думаю, что beforeSend() - гораздо более распространенный способ сделать это в любом случае.

Ответ 3

Поверхность не работает, но есть простое исправление.

 $.ajaxSetup({
        beforeSend: function (jqXHR) {
            if (sendToken == true)
                jqXHR.setRequestHeader("Authorization", cookie);
            return true;
        }
    });

Проверьте переменную sendToken. Это глобально. В начале моего приложения я всегда устанавливал его в true, потому что мне нужен набор заголовков почти везде.

Но когда я не хочу отправлять заголовок "Авторизация", я просто передаю глобальный sendToken в false до того, как любой запрос может пойти. Когда все запросы будут выполнены, я просто просто верну его в true...

Фокус в том, что переменная jqXHR является локальной и не будет сохранять назначенное значение каждый раз. И превышение текущего значения, установленного в ajaxSetup, не работает, потому что оно всегда добавляет новое значение, а не просто заменяет его. Имея условие на вершине, я считаю самым простым и эффективным способом.

Это сработало для меня.

Ответ 4

Это приведет к удалению набора заголовков с $.ajaxSetup(). Думаю, он будет работать и с beforeSend().

delete $.ajaxSettings.headers["custom-xid-header"]