yeminping 发表于 2013-1-23 02:54:23

利用script标签实现的跨域名AJAX请求(ExtJS)

在AJAX应用环境中,由于安全的原因,浏览器不允许XMLHttpRequest组件请求跨域资源。在很多情况下,这个限制给我来带来的诸多不便。很多同行,研究了各种各样的解决方案:
1.通过修改document.domain和隐藏的IFrame来实现跨域请求。这种方案可能是最简单的一种跨域请求的方案,但是它同样是一种限制最大的方案。首先,它只能实现在同一个顶级域名下的跨域请求;另外,当在一个页面中还包含有其它的IFrame时,可能还会产生安全性异常,拒绝访问。
2.通过请求当前域的代理,由服务器代理去访问另一个域的资源。XMLHttpRequest通过请求本域内的一个服务器资源,将要访问的目标资源提供给服务器,交由服务器去代理访问目标资源。这种方案,可以实现完全的跨域访问,但是开发,请求过程的消费会比较大。
3.通过HTML中可以请求跨域资源的标签引用来达到目的,比如Image,Script,LINK这些标签。在这些标签中,Script无疑是最合适的。在请求每一个脚本资源时,浏览器都会去解析并运行脚本文件内定义的函数,或需要马上执行的JavaScript代码,我们可以通过服务器返回一段脚本或JSON对象,在浏览器解析执行,从而达到跨域请求的目的。使用script标签来实现跨域请求,只能使用get方法请求服务器资源。并且传参的长度也受到地址栏长度的限制。
这里,我们来介绍第三种方案。先来看一段在网络上找到的例子(具体来源已经不得而知了,如果有人知道请提供原文链接,谢谢):
JavaScript:
<div style=""><div style="">   1: var scriptBlock = document.createElement("script");   2:     3: function StartGet()   4: {   5:   scriptBlock.src = "";   6:   scriptBlock.src = "http://Domain2/GetData.aspx";   7:   scriptBlock.type = "text/javascript";   8:   scriptBlock.language = "javascript";   9:   document.getElementsByTagName("head").appendChild(scriptBlock);10:   scriptBlock.onreadystatechange = ReturnData;11: }12:  13: function ReturnData()14: {15:   //alert(scriptBlock.readyState);16:  17:   //uninitialized      Object is not initialized with data. 18:   //loading            Object is loading its data. 19:   //loaded            Object has finished loading its data. 20:   //interactive       User can interact with the object even though it is not fully loaded. 21:   //complete          Object is completely initialized. 22:  23:   if("loaded" == scriptBlock.readyState)24:   {25:         var div = document.getElementById("htmldiv");26:         div.innerHTML = a.project.name; //a是返回的json里面的变量27:   }    28: }
页: [1]
查看完整版本: 利用script标签实现的跨域名AJAX请求(ExtJS)