Заголовки запроса контроля доступа, добавляются в заголовок в AJAX-запросе с помощью jQuery


405

Я хотел бы добавить пользовательский заголовок в запрос AJAX POST от jQuery.

Я пробовал это:

$.ajax({
    type: 'POST',
    url: url,
    headers: {
        "My-First-Header":"first value",
        "My-Second-Header":"second value"
    }
    //OR
    //beforeSend: function(xhr) { 
    //  xhr.setRequestHeader("My-First-Header", "first value"); 
    //  xhr.setRequestHeader("My-Second-Header", "second value"); 
    //}
}).done(function(data) { 
    alert(data);
});

Когда я отправляю этот запрос и смотрю с FireBug, я вижу этот заголовок:

ОПЦИИ xxxx / yyyy HTTP / 1.1
Хост: 127.0.0.1:6666
Пользователь-агент: Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 11.0) Gecko / 20100101 Firefox / 11.0
Принимать: текст / html, application / xhtml + xml, application / xml; q = 0,9, / ; q = 0,8
Accept-Language: fr, fr-fr; q = 0,8, en-us; q = 0,5, en; q = 0,3
Accept-Encoding: gzip, deflate
Соединение: сохранить -alive Источник
: null
Access-Control-Request-Method: POST
Access-Control-Request-Headers: my-first-header, my-second-header
Pragma: без кэширования
Cache-Control: без кэширования

Почему мои пользовательские заголовки идут по адресу Access-Control-Request-Headers:

Access-Control-Request-Headers: my-first-header, my-second-header

Я ожидал значения заголовка, как это:

My-First-Header: первое значение
My-Second-Header: второе значение

Является ли это возможным?



В названии вопроса должно быть указано, что «Для другого домена»
бухгалтер م

Ответы:


138

То, что вы видели в Firefox, не было настоящей просьбой; обратите внимание, что HTTP-метод - это OPTIONS, а не POST. На самом деле это был «предполетный» запрос, который браузер делает, чтобы определить, следует ли разрешить междоменный AJAX-запрос:

http://www.w3.org/TR/cors/

Заголовок Access-Control-Request-Headers в предполетном запросе включает в себя список заголовков в реальном запросе. Затем ожидается, что сервер сообщит, поддерживаются ли эти заголовки в этом контексте или нет, прежде чем браузер отправит фактический запрос.


438

Вот пример того, как установить заголовок запроса в вызове jQuery Ajax:

$.ajax({
  type: "POST",
  beforeSend: function(request) {
    request.setRequestHeader("Authority", authorizationToken);
  },
  url: "entities",
  data: "json=" + escape(JSON.stringify(createRequestObject)),
  processData: false,
  success: function(msg) {
    $("#results").append("The result =" + StringifyPretty(msg));
  }
});

10
спасибо, я знаю отправить запрос Ajax с пользовательским заголовком. Моя проблема с другим доменом. Все мои пользовательские заголовки помещены в Access-Control-Request-Headers. это просто безопасность в браузере: междоменный.
fingerup

да, в браузере междоменные запросы могут вызвать некоторые трудности. вы всегда можете использовать прокси-скрипт для отправки междоменных запросов
milkovsky

Как добавить заголовки с помощью API KEY?
Si8

@ Si8, пожалуйста, проверьте это сообщение stackoverflow.com/questions/5517281/…
milkovsky

178

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

$.ajax({
    url: 'YourRestEndPoint',
    headers: {
        'Authorization':'Basic xxxxxxxxxxxxx',
        'X-CSRF-TOKEN':'xxxxxxxxxxxxxxxxxxxx',
        'Content-Type':'application/json'
    },
    method: 'POST',
    dataType: 'json',
    data: YourData,
    success: function(data){
      console.log('succes: '+data);
    }
  });

1
спасибо, я знаю отправить запрос Ajax с пользовательским заголовком. Моя проблема с другим доменом. Все мои пользовательские заголовки помещены в Access-Control-Request-Headers. это просто безопасность в браузере: междоменный.
fingerup

Спасибо, я случайно установил заголовки: «Авторизация: Basic XXXXXX», и iOS 9 / Safari 9 запускал SyntaxError DOM 12 для проекта.
Mark

4
Вы имеете в виду двойные или одинарные кавычки? Я не думаю, что кто-то будет использовать двойные скобки.
DBS

3
Двойные или одинарные кавычки (не «скобки») здесь не имеют ничего общего.
Pere

его X-CSRF-TOKEN для Laravel 5.6 и выше
Абдул Рахман Самад

12

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

Введите описание изображения здесь

Если вы включите CORS на сервере, тогда ваш код будет работать. Вы также можете использовать выборку JavaScript вместо этого ( здесь )

Вот пример конфигурации, которая включает CORS для nginx (файл nginx.conf):

Вот пример конфигурации, которая включает CORS на Apache (файл .htaccess)


3

И именно поэтому вы не можете создать бота с JavaScript, потому что ваши возможности ограничены тем, что позволяет вам делать браузер. Вы не можете просто заказать браузер, который следует политике CORS , которой придерживается большинство браузеров, для отправки случайных запросов другим источникам и получения простого ответа!

Кроме того, если вы попытались отредактировать некоторые заголовки запросов вручную, например, origin-headerиз инструментов разработчика, которые поставляются с браузерами, браузер откажется от вашего редактирования и может отправить предварительный OPTIONSзапрос.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.