2013-12-03 3 views
13

Точка уточнения: У меня нет проблем с добавлением настраиваемого заголовка в мой jQuery-вызов ajax, я хочу, чтобы мой пользовательский заголовок был добавлен во все вызовы ajax автоматически.Добавить пользовательский HTTP-заголовок для всех запросов jQuery AJAX

Если вы посмотрите на jquery $.ajax custom http headers issue (не на мой вопрос), вы увидите довольно хороший пример того, как работает код, если он будет реализован вручную для каждого вызова ajax.

Я хотел бы переопределить beforeSend для всех вызовов jQuery ajax. Согласно документации jQuery, я могу это сделать, используя jQuery.ajaxSetup(), но есть предупреждение о том, что вы, вероятно, не должны, могут вызвать неожиданное поведение, все это. Для глобальных обратных вызовов такого типа они предлагают использовать .ajaxStart(). .ajaxStart() выглядит отлично, за исключением того, что он не предоставляет XHR, поэтому я могу добавить заголовок.

Должен ли я просто добавить beforeSend с помощью ajaxSetup? Есть ли способ получить доступ к XHR из ajaxStart? Другие варианты?

+0

Вы можете добавить prefilter, http://api.jquery.com/jQuery.ajaxPrefilter/ –

+0

@KevinB - Можете ли вы опубликовать это как ответ? – Peter

ответ

23

Предварительный фильтр будет простой способ достижения этого:

$.ajaxPrefilter(function(options) { 
    if (!options.beforeSend) { 
     options.beforeSend = function (xhr) { 
      xhr.setRequestHeader('CUSTOM-HEADER-KEY', 'CUSTOM-HEADER-VALUE'); 
     } 
    } 
}); 

таким образом все запросы получит пользовательский заголовок, если только указанный запрос не отменяет параметр beforeSend.

Обратите внимание, что вы можете выполнить ту же цель, используя ajaxSetup. единственная причина, по которой это предупреждение, заключается в том, что использование этого параметра повлияет на все запросы ajax (как и мой метод), что может привести к нежелательным результатам, если конкретному запросу не нужна эта опция. Я бы предложил просто использовать ajaxSetup, вот почему он есть.

+4

Вам не нужно изменять функцию 'beforeSend'. Объект jqXHR отображается как часть аргументов в функции '$ .ajaxPrefilter (options, originalOptions, jqXHR)'. Поэтому вы можете просто написать внутри функции prefilter 'jqXHR.setRequestHeader ('CUSTOM-HEADER-KEY', 'CUSTOM-HEADER-VALUE');' – AsGoodAsItGets

13

Вы можете использовать Ajax глобальное событие ajaxSend()

$(document).ajaxSend(function(event, jqxhr, settings) { 
    jqxhr.setRequestHeader(name, value) 
}); 

Демо: Fiddle

Смежные вопросы