如何理解跨域和解决跨域问题。

        首先我们在研究一个问题的时候要走一定的步骤,这个步骤是固定不变的,比如,跨域问题,首先我们要了解什么是跨域,它是如何产生的?


        跨域:DOM同源策略:禁止对不同源页面DOM进行操作。这里主要场景是iframe跨域的情况,不同域名的iframe是限制互相访问的。XmlHttpRequest同源策略:禁止使用XHR对象向不同源的服务器地址发起HTTP请求。对于一个普通域来说,https://nethosweb.diandianys.com/html/index/  中,协议名,域名,端口号,三者缺一不可,任何一个不一样都会发生跨域,同源策略是为了保证本域名下数据安全提出来的,这是一种比较好的思想,先对反面的全面禁止,然后再给正面访问放出一些口子,是一种处理思路。产生跨域问题后,我们要怎么解决呢,项目中往往会遇到跨域问题,比如我要下载一个后台返回的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: http://www.yourhost.com。Access-Control-Allow-Credentials:true,我们就可以访问这个域名了,但是安全性肯定降低了。




       三、代理,服务器代理真的是万能的,既然跨域是因为域名里面不一致发生的,那我们可以通过新建一个域名去后台访问目标域名获取数据,这样就避开了在dom中获取数据,也能解决这个问题。


      总结一下,五中解决办法:


       jsonp,


       ajax(header('Access-Control-Allow-Orgin:http://....'))


       window.name+iframe


       window.location.hash+iframe


       html5 postMessage+ifrme


 

你可能感兴趣的:(跨域,代理)