源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

深入分析JSONP跨域的原理

  • 时间:2021-06-28 22:12 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:深入分析JSONP跨域的原理
JavaScript是一种在Web开发中经常使用的前端动态脚本技术。在JavaScript中,有一个很重要的安全性限制,被称为“Same- Origin Policy”(同源策略)。这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档 在同一域下的内容。 JavaScript这个安全策略在进行多iframe或多窗口编程、以及Ajax编程时显得尤为重要。根据这个策略,在baidu.com下的 页面中包含的JavaScript代码,不能访问在google.com域名下的页面内容;甚至不同的子域名之间的页面也不能通过JavaScript代 码互相访问。对于Ajax的影响在于,通过XMLHttpRequest实现的Ajax请求,不能向不同的域提交请求,例如,在 abc.example.com下的页面,不能向def.example.com提交Ajax请求,等等。 然而,当进行一些比较深入的前端编程的时候,不可避免地需要进行跨域操作,这时候“同源策略”就显得过于苛刻。JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并且探讨下JSONP跨域的原理。 利用在页面中创建<script>节点的方法向不同域提交HTTP请求的方法称为JSONP,这项技术可以解决跨域提交Ajax请求的问题。JSONP的工作原理如下所述: 假设在[url=http://example1.com/index.php]http://example1.com/index.php[/url]这个页面中向[url=http://example2.com]http://example2.com[/url] /getinfo.php提交GET请求,我们可以将下面的JavaScript代码放在[url=http://example1.com/index.php]http://example1.com/index.php[/url]这 个页面中来实现:
[url=http://example2.com/getinfo.php]http://example2.com/getinfo.php[/url]"; document.getElementsByTagName("HEAD")[0].appendChild(eleScript);
当GET请求从[url=http://example2.com/getinfo.php]http://example2.com/getinfo.php[/url]返回时,可以返回一段JavaScript代码,这段代码会自动执行,可以用来负责调用[url=http://example1.com/index.php]http://example1.com/index.php[/url]页面中的一个callback函数。 [b]JSONP的优点是[/b]:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中 都可以运行,不需要XMLHttpRequest或ActiveX的支持;并且在请求完毕后可以通过调用callback的方式回传结果。 [b]JSONP的缺点则是[/b]:它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。 再来一个例子:
[url=http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd]http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd[/url]">  <html xmlns="[url=http://www.w3.org/1999/xhtml]http://www.w3.org/1999/xhtml[/url]" >  <head>      <title>Test Jsonp</title>      <script type="text/javascript">              function jsonpCallback(result)              {              alert(result.msg);              }          </script>      <script type="text/javascript" src="[url=http://crossdomain.com/jsonServerResponse?jsonp=jsonpCallback"></script]http://crossdomain.com/jsonServerResponse?jsonp=jsonpCallback"></script[/url]>  </head>  <body>  </body>  </html>
其中 jsonCallback 是客户端注册的,获取跨域服务器上的json数据后,回调的函数。[url=http://crossdomain.com]http://crossdomain.com[/url] /jsonServerResponse?jsonp=jsonpCallback 这个 url 是跨域服务器取 json 数据的接口,参数为回调函数的名字,返回的格式为:jsonpCallback({msg:'this is json data'}) 简述原理与过程:首先在客户端注册一个callback, 然后把callback的名字传给服务器。此时,服务器先生成 json 数据。 然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp。最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。 客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里。(动态执行回调函数)
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部