Как отправить собственный заголовок в междоменном (CORS) XMLHttpRequest?
Я пытаюсь отправить запрос CORS для полезной нагрузки JSON. Я контролирую как сервер, так и клиент.
Здесь я следую: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control
На сервере есть собственный заголовок, который необходимо отправлять вместе с каждым запросом. Таким образом, этот пользовательский заголовок делает запрос "не простым", и поэтому запрос должен быть предварительно обработан запросом OPTIONS.
Я вижу, как jquery делает запрос OPTIONS, но он не отправляет пользовательский заголовок.
Методы, которые я пробовал:
- используя параметр beforeSend: http://api.jquery.com/jQuery.ajax/
- используя префильтр ajax: http://api.jquery.com/jQuery.ajaxPrefilter/
В обоих случаях браузер не отправляет пользовательский заголовок.
Я использую FF 17.0.1, jquery 1.8.3.
1 ответ
Ваша проблема не в jquery, а в том, как работает CORS. Ваш обратный вызов beforeSend, вероятно, работал должным образом... но браузеры не будут отправлять пользовательские заголовки в предварительных запросах, несмотря ни на что. Это по замыслу; цель предварительного запроса состоит в том, чтобы определить, какую информацию пользователь-агент (браузер) разрешено отправлять, помимо "простых" вещей, определенных в спецификации CORS. Таким образом, для userragent отправка любых непростых данных (таких как ваш пользовательский заголовок) в качестве части запроса предварительной проверки является самоубийством.
Чтобы поручить userragent включить ваш пользовательский заголовок в текущий запрос CORS, включите Access-Control-Allow-Headers
заголовок в вашем предполетном ответе. Стоит отметить, что если вы не слишком озабочены тем, какие заголовки передает useragent, я считаю, что вы можете просто отразить значение Access-Control-Request-Headers
поле заголовка запроса в качестве значения Access-Control-Allow-Headers
Вы отправляете в ответ.
Вы также можете включить некоторые другие Access-Control-Allow-*
заголовки, определенные в разделе синтаксиса спецификации.
См. Также CORS - Как выполнить предварительную проверку httprequest?
См. Также пример предварительной проверки CORS в Mozilla, который показывает эти заголовки в действии.