欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

跨域和解决跨域问题该如何理解?

程序员文章站 2023-10-28 15:00:28
首先我们在研究一个问题的时候要走一定的步骤,这个步骤是固定不变的,比如,跨域问题,首先我们要了解什么是跨域,它是如何产生的? 跨域:dom同源策略:禁止对不同源页面dom进行操作...

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

跨域: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