手机版

AJAX javascript的跨域访问执行

时间:2021-11-26 来源:互联网 编辑:宝哥软件园 浏览:

javascript0.jpg

突然觉得这里是个问题。学了之后,其实觉得挺轻松的,但是还是欠缺一些知识。解决方案如下:阻塞的AJAX请求让我们首先确认请求的阻塞情况。我们使用以下代码:连续发起三个请求复制代码如下: FunctionSimpleRequest(){ var request=new xmlhttprequest();request.open("POST "," script . ashx ");request . send(null);} function three requests(){ SimpleRequest();simpleRequest();simpleRequest();}执行threeRequests时,会连续发出三个相同域名的请求,或者通过统计图检查阻断效果:script1.jpg

最后一个请求被前两个请求阻止,每个请求需要1.5秒。显然,第三个请求在第一个请求完成后才能执行,所以需要3秒多的时间才能完成。这是我们需要改变的。在传统的跨域异步请求解决方案中,AJAX安全性的唯一保证似乎是对跨域(AJAX)请求的限制。禁止向其他域名发送AJAX请求,除非您在本地硬盘上打开网页或在IE中打开跨域名数据传输的限制。而且对跨域名的判断非常严格。同一个域名的不同子域或不同端口将被视为不同的域名,我们不能向它们的资源发送AJAX请求。表面上看,似乎没有办法打破这种限制。幸运的是,我们有一个救世主,那就是iframe!虽然iframe没有出现在标准中,但FireFox“不得不”支持它,因为它真的很有用(类似于innerHTML)。互联网上有一些跨域名发送异步请求的做法,但做得并不好。它们简单的工作原理如下:将特定的页面文件放在另一个域名下作为Proxy,主页面通过QueryString将异步请求信息传输到iframe中的Proxy页面。在执行AJAX请求后,Proxy页面将结果放在自己位置的散列中,而主页面轮询iframe的src的散列值,一旦发现它发生了变化,就通过散列值获得所需的信息。该方法实现复杂,功能有限。在IE和FireFox中,URL的长度可以支持2000个字符左右。对于普通需求来说可能足够了,但是如果要传输大量的数据,那就远远不够了。与我们后面提出的解决方案相比,或许它唯一的优势就是可以跨任意域名进行异步请求,而我们的解决方案只能突破子域的限制。现在让我们来看看我们的做法!优雅地突破子域限制,突破子域限制的关键在于iframe。Iframe是个好东西。我们可以跨子域访问iframe中的页面对象,比如窗口和DOM结构,包括调用JavaScript(通过窗口对象)——。我们可以将内部和外部页面的document.domain设置为相同。然后在不同的子域页面上发起不同的请求,并通过JavaScript传递结果。所需要的只是一个简单的静态页面作为代理。现在让我们开始写一个原型,虽然简单,但是可以解释问题。首先,让我们在iframe中编写一个静态页面作为代理。以下是SubDomainProxy.html的复制代码: html xmns=" http://www . w3 . org/1999/XHTML " head title untitle dpage/title script type=" text/JAVAScript " language=" JAVAScript " document . domain=" test.com ";functionsendRequest(方法,URL){ varrequest=newXMLHttpRequest();request.open(方法,URL);request . send(null);} /script /head body /body /html然后我们将编写我们的主页:http://www.test.com/Default.html复制代码如下: html xmns=" http://www . w3 . org/1999/。XHTML " head runat=" server " title untitledpage/title script type=" text/JavaScript " language=" JavaScript " document . domain=" test.com ";functionsimpleRequest(){ varrequest=new xmlhttprequest();request.open("POST "," script . ashx ");request . send(null);} functioncrosssubdomain request(){ varproxy=document . getelementbyid(" IFrameProxy ")。contentWindowproxy.sendRequest('POST ',' http://sub 0 . test.com/script . ashx ');} function three requests(){ SimpleRequest();simpleRequest();crosssubdomain request();}/script/head body inputtype=" button " value=" Request " onclick=" TripRequests()"/iframesrc=" http://sub 0 . test.com/subdomain proxy . html " style=" display : none;"id=" iframe proxy "/iframe/body/html当执行threeRequests方法时,将同时请求两个不同域名(http://www.test.com和http://sub0.test.com)下的资源。

显然,最后一个请求不再被前两个请求阻塞:script2.jpg

对不同域名的请求不会被阻止。满意的结果!虽然只能突破子域,但也足够了,不是吗?为什么我们坚持任何域名都可以异步通信?更何况我们的解决方案如此优雅!在下一篇文章中,我们将实现一个完整的ASP跨子域请求执行器。NETAJAX客户端,它将自动确定是否发出跨子域请求,并选择AJAX请求模式。这样,客户端的异步通信层将对开发人员完全透明。世界上还有比这更令人愉快的事情吗?3360)注意事项以下几点可能值得一提:这个想法出现后我做了一些尝试,最终发现创建XMLHttpRequest对象,调用open方法和send方法,必须在iframe中的页面中执行,才能在IE和FireFox中成功发送AJAX请求。在上面的例子中,我们从子域请求的路径是http://sub0.test.com/Script.ashx.请注意,完整的子域名称不能省略,否则在FireFox下会出现权限不足的错误,调用open方法时会抛出异常——。似乎FireFox将其视为父页面域名的资源。由于浏览器的安全策略,浏览器不允许不同的域(如phinest.org和lab.phinest.org)、不同的协议(如:http://phinest.org和https://phinest.org)、不同端口下的页面(如:http:phinest.org和http://phinest.org:8080)通过XMLHTTPRequest相互访问,这也影响了Javascript在不同页面上的相互调用和控制,但是当主域、协议和端口相同时,通过设置文档的主域.页面的域,Javascript例如,通过设置document.domain='phinest.org ',http://phinest.org和http://lab.phinest.org的页面可以互相访问。在这种情况下,该特性还为不同子域下的XMLHTTPRequest提供了相互访问的解决方案。至于Ajax跨域问题,当主域、协议、端口相同的时候,早就说document.domain是设置来解决的,但是没有看到具体的成功应用。这种尝试的原理是用一个隐藏的iframe跨另一个子域引入页面作为代理,用Javascript控制iframe引入的另一个子域的XMLHTTPRequest进行数据采集。不同主域/不同协议/不同端口的Ajax访问需要通过后台的代理来实现。

版权声明:AJAX javascript的跨域访问执行是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。