Ответ 1
$.ajaxSetup({
beforeSend: function(jqXHR, settings) {
jqXHR.setRequestHeader('custom-xid-header', null);
}
})
Im пишет JS script, который живет в системе, которая теперь добавляет пользовательский заголовок XID ко всем запросам Ajax через jqXHR.setRequestHeader() в функции, зарегистрированной в jQuery.ajaxPrefilter().
В моем script мне нужно сделать запрос Ajax на сторонний сайт, чьи Access-Control-Allow-Headers не настроены, чтобы разрешить этот пользовательский заголовок XID.
Кажется, у меня есть 3 варианта:
Вариант № 1 является предпочтительным, если это простой способ сделать это, так как это будет самый чистый и быстрый маршрут. Просто не могу понять, как.
Я пробовал переопределить его так, но он не работал:
beforeSend: function(jqXHR, settings) {
jqXHR.setRequestHeader('custom-xid-header', null);
}
Любые идеи?
$.ajaxSetup({
beforeSend: function(jqXHR, settings) {
jqXHR.setRequestHeader('custom-xid-header', null);
}
})
Я понимаю, что это старый поток, но это все еще проблема! Надеюсь, что следующее поможет решить эту проблему для кого-то другого, как это имеет место для нас.
Настройка заголовка на 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()
- гораздо более распространенный способ сделать это в любом случае.
Поверхность не работает, но есть простое исправление.
$.ajaxSetup({
beforeSend: function (jqXHR) {
if (sendToken == true)
jqXHR.setRequestHeader("Authorization", cookie);
return true;
}
});
Проверьте переменную sendToken. Это глобально. В начале моего приложения я всегда устанавливал его в true, потому что мне нужен набор заголовков почти везде.
Но когда я не хочу отправлять заголовок "Авторизация", я просто передаю глобальный sendToken в false до того, как любой запрос может пойти. Когда все запросы будут выполнены, я просто просто верну его в true...
Фокус в том, что переменная jqXHR является локальной и не будет сохранять назначенное значение каждый раз. И превышение текущего значения, установленного в ajaxSetup, не работает, потому что оно всегда добавляет новое значение, а не просто заменяет его. Имея условие на вершине, я считаю самым простым и эффективным способом.
Это сработало для меня.
Это приведет к удалению набора заголовков с $.ajaxSetup(). Думаю, он будет работать и с beforeSend().
delete $.ajaxSettings.headers["custom-xid-header"]