Заголовки запроса контроля доступа, добавляются в заголовок в 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: второе значение

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

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

Ответы:

138

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

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

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

karlgold
источник
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);
    }
  });
G-Раф
источник
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запрос.

бухгалтер
источник
-10

Попробуйте использовать стойку-Корс камень. И добавьте поле заголовка в ваш вызов Ajax.

Джи Сан
источник