С точки зрения разделения фронт-энда и бэкэнда,междоменный запросэто первая проблема, которую нам нужно решить. Ниже приведены некоторые из опытов, которые я обобщил в процессе разработки.
В разработке часто будет появлятьсяОпцииЗапрос(Предварительный запрос CORS), но иногда он не появляется. Некоторые запросы не запускают предварительные запросы CORS, такие запросы называютсяпростой запрос, другие запросы называютсяне простой запрос. Во-первых, давайте различать простые запросы и непростые запросы.
Простой и не простой запрос запросы
браузер будетCORSЗапросы делятся на две категории:простой запрос(простой запрос) ине простой запрос(не очень простая просьба).
Пока следующие два условия выполняются одновременно, это простой запрос.
HEAD,GET,POST
2. Информация заголовка HTTP не превышает следующих полей:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type: ограничено тремяЗначение приложения / X-www-формы-орленкадированного,multipart/form-data,text/plain凡是不同时满足上面两个条件,就属于非简单请求
. Браузеры обрабатывают эти два запроса по-разному.
2. Прочесывание головы, связанное с междоменным
Теперь мы знаем, какие из наших запросов являются простыми запросами, а какие — сложными.Вышеупомянутые заголовки HTTP и междоменные запросы CORS, полное название CORSCross-origin resource sharing, то есть,Совместное использование ресурсов между источниками, браузер ограничивает перекрестные домена HTTP-запросы с точки зрения безопасности, котораяТа же политика происхождения, поэтому серверной части необходимо установить заголовок запроса для разрешения междоменного доступа.
1. Методы разрешения доступа:
представляет собой строку, разделенную запятыми,Метод для указания перекрестных запросов, разрешенных сервером.
2. Заголовки Access-Control-Allow:
представляет собой строку, разделенную запятыми,Указывает все поля заголовка, поддерживаемые сервером., не ограничиваясь полями, запрошенными браузером в «предпечатной проверке».
3. Доступ для контроля доступа - учетные данные:
Это поле указывает, может ли ответ на запрос быть выставлен странице, вообще говоря.cookie.Учетные данные должны быть настроены как на переднем, так и на внутреннем интерфейсе, чтобы запросы CORS с учетными данными выполнялись успешно..jQueryможет быть установленxhrFields: {withCredentials:true}
,promiseможет быть установленcredentials: 'include'
.
4. Access-Control-Max-Age:
Используется для указания этого запроса предварительной проверкиСрок годностиЕдиница вторая.
5. Access-Control-Allow-Origin:
выражатьРазрешено ли совместное использование ресурса с данным источником.
6. Access-Control-Expose-Headers:
Заголовки ответа Access-Control-Expose-Headers перечисляет, какие заголовки могут быть частью ответа.Выставить наружу. По умолчанию только шесть простых заголовков ответов (simple response headers) могут быть выставлены внешнему миру:Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma. Если вы хотите, чтобы клиент имел доступ к другим заголовкам, вы можете перечислить их в Access-Control-Expose-Headers.
7. Заголовки запроса управления доступом:
Заголовок запроса Access-Control-Request-Headers появляется впредварительный запроссередина,Используется для информирования сервера о том, какие заголовки запроса будут использоваться в реальном запросе..
8. Метод запроса контроля доступа:
заголовок запросаAccess-Control-Request-MethodПоявляется в предварительном запросе, чтобы сообщить серверу, какой метод HTTP использовать в фактическом запросе. потому что метод, используемый предварительным запросом, всегдаOPTIONS, который не совпадает с методом, используемым в фактическом запросе, поэтому этот заголовок необходим.
3. Отправить файлы cookie
Если вам нужно отправлять куки, как передние, так и задние концы настроены, и передний конец необходимо установить jQuery, который можно установить настройкиxhrFields: {withCredentials:true}
, обещания могут быть установленыcredentials: 'include'
.
Серверная сторона должна быть установленаres.setHeader('Access-Control-Allow-Credentials', 'true');
В противном случае браузер сообщит об ошибке:
Следует отметить, что если вы хотите отправлять файлы cookie, в Access-Control-Allow-Origin нельзя установить звездочку, и вы должны указать четкое доменное имя, соответствующее запрашиваемой веб-странице.
в то же время,Файлы cookie по-прежнему следуют политике того же происхождения, будут загружены только файлы cookie, установленные с доменным именем сервера, файлы cookie с другими доменными именами не будут загружены, а document.cookie в исходном коде веб-страницы (перекрестного происхождения) не может прочитать файлы cookie под доменным именем сервера.
В это время браузер сообщит об ошибке
//解析cookie的函数
function parseCookies (request) {
let list = {},
rc = request.headers.cookie;
rc && rc.split(';').forEach(function( cookie ) {
let parts = cookie.split('=');
list[parts.shift().trim()] = decodeURI(parts.join('='));
});
return list;
}
http.createServer(function (request, response) {
//读取cookie
var cookies = parseCookies(request);
//写入cookie
response.writeHead(200, {
'Set-Cookie': 'mycookie=test',
'Content-Type': 'text/plain'
});
response.end('Hello World\n');}).listen(8124);
})
В-четвертых, значение Content-Type и его роль
При подключении к внутреннему интерфейсуЗначение Content-Type определяет, как бэкэнд анализирует наши параметры.. Content-type обычно используется несколько значений:
1.text/html
2.text/plain
3.text/css
4.text/javascript
5.application/x-www-form-urlencoded
6.multipart/form-data
7.application/json
8.application/xml
Первые несколько хорошо понятны, и все они представляют собой файлы html, css и javascript.Следующие четыре - пакет для волос поста.
1. приложение/x-www-форма-urlencoded
Формат отправки формы по умолчанию в html, тип содержимого запроса jquery ajax по умолчанию также является этим форматом по умолчанию, и jquery преобразует данные: {foo1:"bar1",foo2:"bar2"} данные в key1=value1&key2= value2, Можно ли отключить предварительную обработку данных через processData Формат данных имеет вид key1=value1&key2=value2.
Ниже приведен код для jquery для предварительной обработки данных.По умолчанию processData имеет значение true, поэтому, если данные имеют значение, он вынесет решение и преобразует формат json в формат key1=value1&key2=value2.
if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
// #9682: remove data so that it's not used in an eventual retry
delete s.data;
}
2. Multipart/form-data
multipart/form-data используется в пакетах POST, которые отправляют файлы.
Здесь Content-Type сообщает нам, что контракт является множественным / форм-форматом передачи данных, который также использовался для граничных данных сегментации.
Когда файл слишком длинный и HTTP не может быть отправлен в одном пакете, данные необходимо разделить на куски и отправить на сервер.
Итак - используется для различения данных, в то время как данные SQE6NHQ4GTMFHLOY имеют маркированное разрешение.
------WebKitFormBoundarysqe6Nhq4gtMfHLOY
Content-Disposition: form-data; name:"UserWxCode"
123
------WebKitFormBoundarysqe6Nhq4gtMfHLOY
Content-Disposition: form-data; name="CodeType"
Public
------WebKitFormBoundarysqe6Nhq4gtMfHLOY--
3. приложение/json
Обязательно при отправке запросаJSON.stringifyодин раз,В HTTP-коммуникациях нет так называемого json., а преобразовать строку в json, то естьПриложение / JSON можно понимать как текст / просто обычная строка.
4. текст/xml и приложение/xml
text/xml игнорирует настройки кодировки в заголовке файла xml (<?xml version=”1.0” encoding=”UTF-8”?>
),По умолчанию используется кодировка us-ascii.. application/xml会В соответствии с настройками, закодированными в заголовке файла xml.рекомендуется приложение/xml
Пять, выборка и jquery Ajax set Заголовки, куки
//fetch设置Headers,cookies
//方式1
let myHeaders = new Headers({
'Content-Type': 'application/json; charset=UTF-8',
'token': 123
});
//方式2
headers: {
'Content-Type': 'application/json; charset=UTF-8',
'token': 123
}
//发送cookies:
credentials: 'include'
//jquery ajax设置Headers,cookies
//设置header方式一
headers: {
UserName: 'zxplus',
EncryptKey: '1111'
},
//方式二
beforeSend: function(request) {
request.setRequestHeader("UserName", "zxplus");
},
//发送cookie
xhrFields: {
withCredentials:true //支持附带详细信息
},
Ссылаться на
https://stackoverflow.com/questions/3393854/get-and-set-a-single-cookie-with-node-js-http-server
http://www.ruanyifeng.com/blog/2016/04/cors.html
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
https://segmentfault.com/a/1190000006039533
http://www.cnblogs.com/caoshiqing/p/6825608.html
http://homeway.me/2015/07/19/understand-http-about-content-type/