ajax抓取网页内容(AJAX跨域访问执行的相关知识和一些Code实例,欢迎阅读和指正)

优采云 发布时间: 2022-02-24 05:17

  ajax抓取网页内容(AJAX跨域访问执行的相关知识和一些Code实例,欢迎阅读和指正)

  想知道AJAX javascript跨域访问执行的相关内容吗?本文将为大家讲解AJAX跨域访问的相关知识和一些Code示例。欢迎阅读和指正。先说重点:AJAX、javascript、跨域访问,一起来学习。

  <IMG alt=javascript0.jpg src="http://files.jb51.net/upload/20080420224052629.jpg">

  突然觉得这就是这里的问题。研究了一下,其实还是很容易搞定的,只是我的知识还欠缺。解决方法如下:

  阻止 AJAX 请求

  我们先确认一下请求的阻塞。我们使用以下代码:

  连续提出三个请求

  复制代码代码如下:

  函数simpleRequest()

  {

  varrequest=newXMLHttpRequest();

  request.open("POST","Script.ashx");

  request.send(null);

  }

  函数三个请求()

  {

  简单请求();

  简单请求();

  简单请求();

  }

  当执行threeRequests时,会连续发出3个相同域名的请求,或者可以通过统计图查看阻塞的效果:

  <IMG alt=script1.jpg src="http://files.jb51.net/upload/20080420224052920.jpg">

  最后一个请求被前两个请求阻塞

  每个请求需要 1.5 秒。很明显,第三个请求要等到第一个请求完成后才能执行,所以总共需要3秒多的时间才能执行。我们要改变的是这种情况。

  传统跨域异步请求解决方案

  AJAX 安全性的唯一保证似乎是对跨域 AJAX 请求的限制。除非您在本地硬盘上打开网页,或在 IE 中开启跨域数据传输限制,否则禁止向其他域发出 AJAX 请求。而且,跨域名的判断非常严格。不同的子域,或者同一个域名的不同端口,将被视为不同的域名,我们不能向它们的资源发出AJAX请求。

  从表面上看似乎没有办法打破这个限制,但幸运的是我们有一个救星,iframes!

  虽然 iframe 不在标准中,但因为它非常有用,FireFox “不得不”支持它(类似于 innerHTML)。互联网上已经有一些跨域发出异步请求的方法,但它们确实很糟糕。它们的简单工作原理如下:将特定页面文件放在另一个域名下作为Proxy,主页面通过QueryString将异步请求信息传递给iframe中的Proxy页面,Proxy页面将结果放入iframe之后AJAX 请求被执行。在自己位置的hash中,主页面会轮询iframe的src的hash值。一旦发现有变化,就会通过哈希值得到所需的信息。

  这种方法的实现很复杂,功能有限。在 IE 和 FireFox 中,URL 的长度可以支持大约 2000 个字符。对于普通的需求可能已经够用了,可惜如果你真的要传递大量的数据,那是不够的。也许它相对于我们稍后会提出的解决方案的唯一优势是能够跨任意域发出异步请求,这只能突破子域限制。

  那么现在让我们看看我们是如何做到的!

  优雅突破子​​域限制

  突破子域限制的关键还是iframe。

  iframe 是个好东西,我们可以跨子域访问 iframe 中的页面对象,比如 window 和 DOM 结构,包括调用 JavaScript(通过 window 对象)——我们可以设置内页和外页的 document.domain 为相同。. 然后对不同子域的页面发起不同的请求,通过JavaScript传递结果。唯一需要的是一个简单的静态页面作为代理。

  现在让我们开始编写一个原型,它很简单但很有说明性。

  首先,让我们写一个静态页面作为放置在 iframe 中的 Proxy,如下:

  子域代理.html

  复制代码代码如下:

  然后我们编写我们的主页:

  复制代码代码如下:

  在执行threeRequests方法时,会同时请求两个不同域下的资源。显然,最后一个请求不再被前两个请求阻塞:

  <IMG alt=script2.jpg src="http://files.jb51.net/upload/20080420224052610.jpg">

  不同域名的请求不会被拦截

  结果令人满意!

  您只能突破子域,但这已经足够了,不是吗?为什么我们需要在任意域名之间进行异步通信?更不用说我们的解决方案有多优雅了!在下一篇文章文章中,我们将为ASP.NET AJAX客户端实现一个完整的CrossSubDomainRequestExecutor,它会自动判断是否正在进行跨子域请求并选择AJAX请求方式。这样,客户端的异步通信层对开发者来说是完全透明的。世上还有比这更令人愉快的事吗?:)

  防范措施

  或许以下几点值得一提:

  这个想法之后我也做了一些尝试,最后发现创建一个XMLHttpRequest对象,调用open方法和send方法必须在iframe中的页面中执行,才能在IE和FireFox中成功发送AJAX请求。

  在上面的示例中,我们从子域请求的路径是 . 请注意,完整的子域名不能省略,否则在FireFox下会出现权限不足的错误,并且调用open方法时会抛出异常——看来FireFox将其视为父页面域的资源姓名。

  由于浏览器的安全策略,浏览器不允许不同域(如:and)、不同协议(如:and)、不同端口(如:http:and:8080)下的页面通过XMLHTTPRequest相互访问,这个问题也影响了Javascript在不同页面上的相互调用和控制,但是当主域、协议、端口相同时,通过设置页面的document.domain主域,Javascript可以访问不同子域之间的控制,比如通过设置document..domain='',页面可以相互访问。这个特性也为不同子域下的XMLHTTPRequests在这种情况下相互访问提供了一种解决方案。

  对于主域、协议、端口相同时的Ajax跨域问题,早就有人说要设置document.domain来解决,但一直没有看到具体成功的应用。这次我试过了。原理是使用一个隐藏的iframe引入的另一个子域的页面作为代理,通过Javascript控制该iframe引入的另一个子域的XMLHTTPRequest获取数据。对于不同主域/不同协议/不同端口下的Ajax访问,需要通过后台代理来实现。

  相关文章

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线