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

JavaScript的跨域共享的要领

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

  在客户端编程说话中,如javascript和ActionScript,同源计策是一个很重要的安详理念,它在担保数据的安详性方面有着重要的意义。同源计谋划定跨域之间的剧本是断绝的,一个域的剧本不能会见和操纵其它一个域的绝大部门属性和要领。那么什么叫沟通域,什么叫差异的域呢?

  同源计策

  在客户端编程说话中,如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(JSONwithPadding)是一个简朴高效的跨域方法,HTML中的script标签可以加载并执行其他域的javascript,于是我们可以通过script标志来动态加载其他域的资源。

  譬喻我要从域A的页面pageA加载域B的数据,那么在域B的页面pageB中我以JavaScript的情势声明pageA必要的数据,然后在pageA顶用script标签把pageB加载进来,那么pageB中的剧本就会得以执行。JSONP在此基本上插手了回调函数,pageB加载完之后会执行pageA中界说的函数,所必要的数据会以参数的情势转达给该函数。

  JSONP易于实现,可是也会存在一些安详隐患,假如第三方的剧本随意地执行,那么它就可以改动页面内容,截获敏感数据。可是在受信赖的两边转达数据,JSONP长短常吻合的选择。

  flash有本身的一套安详计策,处事器可以通过crossdomain.xml文件来声明能被哪些域的SWF文件会见,SWF也可以通过API来确定自身能被哪些域的SWF加载。当跨域会见资源时,譬喻从域www.a.com哀求域www.b.com上的数据,我们可以借助flash来发送HTTP哀求。

  起首,修改域www.b.com上的crossdomain.xml(一样平常存放在根目次,假如没有必要手动建设),把www.a.com插手到白名单。

  其次,通过FlashURLLoader发送HTTP哀求。

  最后,通过FlashAPI把相应功效转达给JavaScript。FlashURLLoader是一种很广泛的跨域办理方案,不外必要支持iOS的话,这个方案就无能为力了。

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

  在数据提供方没有提供对JSONP协议可能window.name协议的支持,也没有对其余域开放会见权限时,我们可以通过serverproxy的方法来抓取数据。譬喻当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属性,我们可以在域和子域可能差异的子域之间通讯。同域计策以为域和子域附属于差异的域,好比www.a.com和sub.a.com是差异的域,这时,我们无法在www.a.com下的页面中挪用sub.a.com中界说的JavaScript要领。可是当我们把它们document的domain属性都修改为a.com,赏识器就会以为它们处于统一个域下,那么我们就可以相互挪用对方的method来通讯了。

  差异的域之间,JavaScript只能做很有限的会见和操纵,着实我们操作这些有限的会见权限就可以到达跨域通讯的目标了。FIM(FragmentIdentitierMessaging)就是在这个大条件下被发现的。父窗口可以对iframe举办URL读写,iframe也可以读写父窗口的URL,URL有一部门被称为frag,就是#号及厥后头的字符,它一样平常用于赏识器锚点定位,Server端并不体谅这部门,应该说HTTP哀求进程中不会携带frag,以是这部门的修改不会发生HTTP哀求,可是会发生赏识器汗青记录。

  FIM的道理就是改变URL的frag部门来举办双向通讯。每个window通过改变其他window的location来发送动静,并通过监听本身的URL的变革来吸取动静。这个方法的通讯会造成一些不须要的赏识器汗青记录,并且有些赏识器不支持onhashchange变乱,必要轮询来获知URL的改变,最后,URL在赏识器下有长度限定,这个制约了每次传送的数据量。

  页面上的双向通讯也可以通过Flash来办理,FlashAPI中有LocalConnection这个类,该类应承两个SWF之间通过历程通讯,这时SWF可以播放在独立的FlashPlayer可能AIR中,也可以嵌在HTML页面可能是PDF中。遵循这个通讯原则,我们可以在差异域的HTML页面各自嵌套一个SWF来到达彼此转达数据的目标了。

  SWF通过LocalConnection互换数据是很快的,可是每次的数据量有40kb的巨细限定。用这种方法来跨域通讯过于伟大,并且必要了2个SWF文件,适用性不强。

  window.postMessage是HTML5界说的一个很新的要领,这个要领可以很利便地跨window通讯。因为它是一个很新的要领,以是在很旧和较量旧的赏识器中都无法行使。

  JAVASCRIPT总结

(编辑:河北网)

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

热点阅读