Access-Control-Allow-Headers
Когда возникает междоменная проблема, когда браузер отправляет запрос интерфейса, текущая практика обычно добавляет следующую конфигурацию на интерфейсный сервер.
Access-Control-Allow-Origin: *
Но иногдаAccess-Control-Allow-Headersпроблема с ошибкой.
Access to XMLHttpRequest at 'http://www.xxx.com/api' from origin 'http://localhost:8080' has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.
Давайте проанализируем причины и решения ниже.
причина
Когда браузер отправляет запрос с перекрестным доменом и включает в себя поле пользовательского заголовка, браузер сначала отправит запрос на предварительную ставку параметров на сервер, чтобы обнаружить, допускает ли служба запроса на пользовательские полей для перекрестных доменных данных.
Если разрешено, продолжайте выполнять запросы POST и GET, иначе верните сообщение об ошибке.
ВАРИАНТЫ запроса:
Request URL:http://xxx.com/api
Request Method:OPTIONS
Status Code:200 OK
Remote Address:00.00.00.00:80
Referrer Policy:no-referrer-when-downgrade
Request Header:
Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.9,en;q=0.8
Access-Control-Request-Headers:content-type,xfilecategory,xfilename,xfilesize
Access-Control-Request-Method:GET
Connection:keep-alive
Host:http://localhost:8080/
Origin:http://localhost:8080/
User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1
Внимание ⚠️
В этот момент браузер отправит на сервер предварительный запрос с вопросом, поддерживать ли междоменные настраиваемые поля заголовков. задаватьAccess-Control-Request-HeadersСервер должен реагировать соответствующим образом.
ответ сервера
Сервер должен ответить на запрос OPTIONS, установив заголовок, содержащийAccess-Control-Request-Headersи включает запрос OPTIONSAccess-Control-Request-Headersпарное значение.
Например:
response.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token");
Также (на самом деле важно)
Предварительный запрос не будет отправлен, если ваш запрос состоит из простых заголовков.
- Accept
- Accept-Language
- Content-Language
- Content-Type
При включении только этих заголовков запроса, указанных выше (и значений, которые удовлетворяют дополнительным требованиям, перечисленным ниже), запросу не нужно отправлять предварительный запрос в контексте CORS.
Дополнительные требования
CORS-безопасный заголовок также должен соответствовать следующим требованиям, чтобы быть CORS-безопасным заголовком запроса:
- для
Accept-Languageа такжеContent-Language: могут существовать только значения0-9,A-Z,a-z, пробел или*,=.;=. - о
Acceptа такжеContent-Type: НЕ ДОЛЖЕН содержать байты заголовка запроса, небезопасные для CORS:"():<>?@[\]{},Delete,Tabи управляющие символы:0x00прибыть0x19. -
Content-Type: Требуется значение типа MIME (параметр игнорируется). возможноapplication/x-www-form-urlencoded,multipart/form-dataилиtext/plainлюбой из . - для любого
header: Длина значения не может быть больше 128.
Обычно влияет на программу, чтобы отправить предварительный запрос всегдаContent-Typeпараметр. Если нам не нужно отправлять предварительный запрос при выполнении междоменного запроса, то мы можем установить запрос браузераContent-Typeдляapplication/x-www-form-urlencoded,multipart/form-dataилиtext/plainлюбой из них, чтобы избежать.
Например:
headers.set('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
Ссылаться на
developer.Mozilla.org/this-cn/docs/… developer.Mozilla.org/en-US/docs/… stackoverflow.com/questions/2…