跨域和解决跨域问题该如何理解?
首先我们在研究一个问题的时候要走一定的步骤,这个步骤是固定不变的,比如,跨域问题,首先我们要了解什么是跨域,它是如何产生的?
跨域:dom同源策略:禁止对不同源页面dom进行操作。这里主要场景是iframe跨域的情况,不同域名的iframe是限制互相访问的。xmlhttprequest同源策略:禁止使用xhr对象向不同源的服务器地址发起http请求。对于一个普通域来说,协议名,域名,端口号,三者缺一不可,任何一个不一样都会发生跨域,同源策略是为了保证本域名下数据安全提出来的,这是一种比较好的思想,先对反面的全面禁止,然后再给正面访问放出一些口子,是一种处理思路。产生跨域问题后,我们要怎么解决呢,项目中往往会遇到跨域问题,比如我要下载一个后台返回的excel表格,这里会产生跨域。
一、 对于前端来说,解决跨域问题的思路,也很精妙,大家可以联想一下,我们在写项目的时候,通常需要某个线上js文件时,往往会通过script标签引入,这难道不是违反了同源策略吗?是的,按道理是违反了,但是中将这个神奇的标签例外了,那就好说了,我们访问其他域名时将域名包在script标签中不就完了,是的,你很聪明,前端解决跨域问题的根本思想就是这样子。
举个例子:
创建一个脚本,并且告诉后端回调函数名叫fun
var body = document.getelementsbytagname('body')[0];
var script = document.gerelement('script');
script.type = 'text/javasctipt';
script.src = 'demo.js?callback=fun';
body.appendchild(script);
当然,这个只是一个原理演示,实际情况下,我们需要动态创建这个fun函数,并且在数据返回的时候销毁它,一般我们都会用封装好的jsonp去解决,但是只能通过get请求,不能用post请求。
二、对于后台来说,解决跨域问题,是比较简单的,只需要在域名的header头中加入access-control-allow-origin: access-control-allow-credentials:true,我们就可以访问这个域名了,但是安全性肯定降低了。
三、代理,服务器代理真的是万能的,既然跨域是因为域名里面不一致发生的,那我们可以通过新建一个域名去后台访问目标域名获取数据,这样就避开了在dom中获取数据,也能解决这个问题。
总结一下,五中解决办法:
jsonp,
ajax(header('access-control-allow-orgin:https://....'))
window.name+iframe
window.location.hash+iframe
html5 postmessage+ifrme