加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 正文

跨域资源共享的10种方法

发布时间:2018-10-07 01:57:38 所属栏目:创业 来源:站长网
导读:同源计策 在客户端编程说话中,如 Java Script和ActionScript,同源计策是一个很重要的安详理念,它在担保数据的安详性方面有着重要的意义。同源计谋划定跨域之间的剧本是断绝的,一个域的剧本不能会见和操纵其它一个域的绝大部门属性和要领。那么什么叫相
副问题[/!--empirenews.page--]

同源计策

在客户端编程说话中,如JavaScript和ActionScript,同源计策是一个很重要的安详理念,它在担保数据的安详性方面有着重要的意义。同源计谋划定跨域之间的剧本是断绝的,一个域的剧本不能会见和操纵其它一个域的绝大部门属性和要领。那么什么叫沟通域,什么叫差异的域呢?当两个域具有沟通的协议(如http), 沟通的端口(如80),沟通的host(如www.example.org),那么我们就可以以为它们是沟通的域。好比http://www.example.org/index.html和http://www.example.org/sub/index.html是同域,而http://www.example.org, https://www.example.org, http://www.example.org:8080, http://sub.example.org中的任何两个都将组成跨域。同源计策还应该对一些非凡环境做处理赏罚,好比限定file协议下剧本的会见权限。当地的HTML文件在赏识器中是通过file协议打开的,假如剧本能通过file协议会见到硬盘上其余恣意文件,就会呈现安详隐患,今朝IE8尚有这样的隐患。

受到同源计策的影响,跨域资源共享就会受到制约。可是跟着人们的实践和赏识器的前进,今朝在跨域哀求的能力上,有许多名贵履历的沉淀和蕴蓄。这里我把跨域资源共享分成两种,一种是单向的数据哀求,尚有一种是双向的动静通讯。接下来我将摆列出常见的一些跨域方法,以下跨域实例的源代码可以从这里得到。

单向跨域

JSONP

JSONP (JSON with Padding)是一个简朴高效的跨域方法,HTML中的script标签可以加载并执行其他域的JavaScript,于是我们可以通过script标志来动态加载其他域的资源。譬喻我要从域A的页面pageA加载域B的数据,那么在域B的页面pageB中我以JavaScript的情势声明pageA必要的数据,然后在pageA顶用script标签把pageB加载进来,那么pageB中的剧本就会得以执行。JSONP在此基本上插手了回调函数,pageB加载完之后会执行pageA中界说的函数,所必要的数据会以参数的情势转达给该函数。JSONP易于实现,可是也会存在一些安详隐患,假如第三方的剧本随意地执行,那么它就可以改动页面内容,截获敏感数据。可是在受信赖的两边转达数据,JSONP长短常吻合的选择。

Flash URLLoader

Flash有本身的一套安详计策,处事器可以通过crossdomain.xml文件来声明能被哪些域的SWF文件会见,SWF也可以通过API来确定自身能被哪些域的SWF加载。当跨域会见资源时,譬喻从域www.a.com哀求域www.b.com上的数据,我们可以借助Flash来发送HTTP哀求。起首,修改域www.b.com上的crossdomain.xml(一样平常存放在根目次,假如没有必要手动建设) ,把www.a.com插手到白名单。其次,通过Flash URLLoader发送HTTP哀求,最后,通过Flash API把相应功效转达给JavaScript。Flash URLLoader是一种很广泛的跨域办理方案,不外必要支持iOS的话,这个方案就无能为力了。

Access Control

Access Control是较量逾越的跨域方法,今朝只在很少的赏识器中得以支持,这些赏识器可以发送一个跨域的HTTP哀求(Firefox, Google Chrome等通过XMLHTTPRequest实现,IE8下通过XDomainRequest实现),哀求的相应必需包括一个Access-Control-Allow-Origin的HTTP相应头,该相应头声明白哀求域的可会见权限。譬喻www.a.com对www.b.com下的asset.php发送了一个跨域的HTTP哀求,那么asset.php必需插手如下的相应头:

header("Access-Control-Allow-Origin: http://www.a.com");

 

window.name

window工具的name属性是一个很出格的属性,当该window的location变革,然后从头加载,它的name属性可以依然保持稳固。那么我们可以在页面A顶用iframe加载其他域的页面B,而页面B顶用JavaScript把必要转达的数据赋值给window.name,iframe加载完成之后,页面A修改iframe的地点,将其酿成同域的一个地点,然后就可以读出window.name的值了。这个方法很是得当单向的数据哀求,并且协议简朴、安详。不会像JSONP那样不做限定地执行外部剧本。

server proxy

在数据提供方没有提供对JSONP协议可能window.name协议的支持,也没有对其余域开放会见权限时,我们可以通过server proxy的方法来抓取数据。譬喻当www.a.com域下的页面必要哀求www.b.com下的资源文件asset.txt时,直接发送一个指向www.b.com/asset.txt的ajax哀求必定是会被赏识器阻止。这时,我们在www.a.com下配一个署理,然后把ajax哀求绑定到这个署理路径下,譬喻www.a.com/proxy/, 然后这个署剃头送HTTP哀求会见www.b.com下的asset.txt,跨域的HTTP哀求是在处事器端举办的,客户端并没有发生跨域的ajax哀求。这个跨域方法不必要和方针资源签署协议,带有侵犯性,其它必要留意的是实践中应该对这个署理实验必然水平的掩护,好比限定他人行使可能行使频率。

双向跨域

document.domain

通过修改document的domain属性,我们可以在域和子域可能差异的子域之间通讯。同域计策以为域和子域附属于差异的域,好比www.a.com和sub.a.com是差异的域,这时,我们无法在www.a.com下的页面中挪用sub.a.com中界说的JavaScript要领。可是当我们把它们document的domain属性都修改为a.com,赏识器就会以为它们处于统一个域下,那么我们就可以相互挪用对方的method来通讯了。

FIM – Fragment Identitier Messaging

差异的域之间,JavaScript只能做很有限的会见和操纵,着实我们操作这些有限的会见权限就可以到达跨域通讯的目标了。FIM (Fragment Identitier Messaging)就是在这个大条件下被发现的。父窗口可以对iframe举办URL读写,iframe也可以读写父窗口的URL,URL有一部门被称为frag,就是#号及厥后头的字符,它一样平常用于赏识器锚点定位,Server端并不体谅这部门,应该说HTTP哀求进程中不会携带frag,以是这部门的修改不会发生HTTP哀求,可是会发生赏识器汗青记录。FIM的道理就是改变URL的frag部门来举办双向通讯。每个window通过改变其他window的location来发送动静,并通过监听本身的URL的变革来吸取动静。这个方法的通讯会造成一些不须要的赏识器汗青记录,并且有些赏识器不支持onhashchange变乱,必要轮询来获知URL的改变,最后,URL在赏识器下有长度限定,这个制约了每次传送的数据量。

Flash LocalConnection

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读