CORS (Cross-Origin Resource Sharing) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不一样源服务器上的指定的资源。express
当一个资源从与该资源自己所在的服务器不一样的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。npm
浏览器比较Request Header和Response Header跨域
Request Header -> Origin VS Response Header -> Access-Control-Allow-Origin浏览器
Request Header -> Cookie VS Response Header -> Access-Control-Allow-Credentials安全
Request Method VS Response Header -> Access-Control-Allow-Methods (默认有GET/POST/HEAD)性能优化
Request Header -> 其余头部项 VS Response Header -> Access-Control-Allow-Headersbash
简单请求的过程:服务器
client ----> serverapp
server ----> clientcors
非简单请求的过程
client ----> server (OPTION)
server ----> client
client ----> server
server ----> client
同时知足如下五点的请求为简单请求:
使用下列方法之一:GET / HEAD / POST
Fetch 规范定义了对 CORS 安全的首部字段集合,不得人为设置该集合以外的其余首部字段。该集合为:
Accept / Accept-Language / Content-Language / Content-Type (须要注意额外的限制)/ DPR / Downlink / Save-Data / Viewport-Width / Width
text/plain
multipart/form-data
application/x-www-form-urlencoded
请求中的任意XMLHttpRequestUpload 对象均没有注册任何事件监听器;XMLHttpRequestUpload 对象能够使用 XMLHttpRequest.upload 属性访问。
请求中没有使用 ReadableStream 对象。
conf 文件
location / {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
...
}
复制代码
npm install cors --D
var express = require('express');
var cors = require('cors');
var app = express();
var corsOptions = {
origin: 'http://localhost:3000',
optionsSuccessStatus: 200
}
app.use(cors(corsOptions));
复制代码
// kuayu.js
var kuayu = function (req, res, next) {
res.header('Access-Control-Allow-Credentials', 'true');
res.header('Access-Control-Max-Age', 3);
res.header('Access-Control-Allow-Headers', 'x-header');
res.header('Access-Control-Allow-Origin', 'http://localhost:3000');
next();
}
module.exports = kuayu;
复制代码
var express = require('express');
var kuayu = require('./kuayu.js');
var app = express();
app.use(kuayu)
复制代码