1、跨域和同源策略
什么是同源策略?
同源策略是指浏览器处于安全考虑的情况下,只允许本域下的借口进行交互。不同源的客户端在没有授权的情况下是不允许获取对方资源的。
本域指的是什么?
同协议:例如相同的http或https
同域名:例如https://baidu.com/aaa 和 https://baidu.com/bbb
同端口:例如8080端口
一个示例:
跨域解决方案:
JSONP
CORS
nginx反向代理
降域
postMessage
JSONP:最早的解决方案,利用script标签可以跨域的原理实现,只支持get请求
CORS:同源策略
优势:
在服务端进行控制是否允许跨域,可自定义规则
支持各种请求方式
缺点:
会产生额外的请求
阮一峰对CORS的解析:http://www.ruanyifeng.com/blog/2016/04/cors.html
nginx反向代理
思路是:利用nginx反向代理把跨域为不跨域,支持各种请求方式
缺点:需要在nginx进行额外配置,语义不清晰
降域和postMessage:
https://www.jianshu.com/p/7666e1ffb8c6
当没api接口遇到跨域问题时,会报XMLHttpRequest跨域提示:
当使用CORS策略,解决跨域问题时,我的做法是在服务端设置允许访问的接口地址:
app.use(async (ctx, next) => { //添加允许请求头 // ctx.append('Access-Control-Allow-Origin', '*') // ctx.append('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild') // ctx.append('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS,PATCH') // //ctx.append('Content-Type', 'application/json;charset=utf-8') // console.log(`Process ${ctx.request.method} ${ctx.request.url}...`); // logger.info(`Process ${ctx.request.method} ${ctx.request.url}...`) //http 预请求处理(post/put/delete 请求在正式请求之前会先发送一个OPTIONS的预请求,只需要把这个OPTIONS的预请求正常返回,后续的请求就会正常执行) if (ctx.request.method === 'OPTIONS') { ctx.body = "OK" } else { //继续执行api请求 await next(); } });