跨域问题在前端在经常碰到,看到的比较好的解决方案如下:
1、CORS(跨域资源共享)解决方案
http://www.cnblogs.com/yuzhongwusan/p/3677955.html
简单,只需要后端配置请求头即可。
2、jsonp:只能get请求,传输数据较小。需要前后端共同配合,较麻烦
JSONP
JSONP是较为常用的一种跨域方式,不受到浏览器兼容性的限制,但是因为它只能以GET动词进行请求,这样就破坏了标准的REST风格,比较丑陋。JSONP本质上是利用<script>
标签的跨域能力实现跨域数据的访问,请求动态生成的JavaScript脚本同时带一个callback函数名作为参数。其中callback函数本地文档的JavaScript函数,服务器端动态生成的脚本会产生数据,并在代码中以产生的数据为参数调用 callback函数。当这段脚本加载到本地文档时,callback函数就被调用。
(1)浏览器端构造请求地址
function resolveJson(result) {
console.log(result.name);
}
var jsonpScript= document.createElement("script");
jsonpScript.type = "text/javascript";
jsonpScript.src = "http://www.qiute.com?callbackName=resolveJson";
document.getElementsByTagName("head")[0].appendChild(jsonpScript);
标准的Script标签的请求地址为:请求资源的地址+获取函数的字段名+回调函数名称,这里的获取函数的字段名是需要和服务端提前约定好,譬如jQuery中默认的获取函数名就是callback
。而resolveJson是我们默认注册的回调函数,注意,该函数名需要全局唯一,该函数接收服务端返回的数据作为参数,而函数内容就是对于该参数的处理。
(2)服务端构造返回值
在接受到浏览器端 script 的请求之后,从url的query的callbackName获取到回调函数的名字,例子中是resolveJson
然后动态生成一段javascript片段去给这个函数传入参数执行这个函数。比如:
resolveJson({name: 'qiutc'});
(3)客户端以脚本方式执行服务端返回值
服务端返回这个 script 之后,浏览器端获取到 script 资源,然后会立即执行这个 javascript,也就是上面那个片段。这样就能根据之前写好的回调函数处理这些数据了。
3、fetch 解决方案:也需要配合cors
http://blog.csdn.net/technofiend/article/details/67639271