在浏览器的同源策略中,一个网站在未退出的情况下不能请求其他网站的资源,这是为了防止安全攻击。
1. CORS 跨域
CORS 跨域只需在后台文件的头部进行设置,适用于 GET,POST 请求,但在有些比较老的浏览器中不支持。
app.all('*', function(req, res, next) {
res.setHeader("Access-Control-Allow-Origin", 'http://localhost:8080');
res.setHeader("Access-Control-Allow-Credentials", true);
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",' 3.2.1');
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
1. Access-Control-Allow-Orgin
允许的域名,单域名或通配符
2. Access-Control-Credentials
是否允许 cookie 跨域
3. Content-Type
内容的类型
application/x-www-form-urlencoded
multipart/form-data
application/json
application/xml
4. Access-Control-Allow-Methods
允许跨域的请求
注意
如果要允许 cookie 跨域前端 AJAX 请求也要进行设置
xhrFields: {
withCredentials: true,
},
预检请求
在跨域的实际请求之前浏览器会发送一次预检请求
1. 发送预检请求,使用的是 options 方法,主要首部字段(示例)
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Ccontent-Type
告知服务器
实际请求将使用 POST 方法
实际请求将自定义两个首部字段 X-PINGOTHER 和 Content-Type
2. 预检请求的响应首部字段(示例)
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400
告知浏览器
允许请求的方法 POST GET OPTIONS
允许修改的首部字段 X-PINGOTHER Content-Type
有效时间为 86400 秒,在这段时间内无需再发送预检请求,但该时间如果超过浏览器默认时间则以浏览器默认时间为准
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
2. JSONP 跨域
JSONP 跨域是并不是一种规定只是相互之间的一种约定,只能跨域 GET 请求。
1. 在前端页面中的 jquery 中的 AJAX 中添加下面属性
dataType: "jsonp",
jsonp: "callback",
2. 在后台页面返回数据时使用的时 JSONP 格式
res.jsonp(data);
网友评论