【问题标题】:AJAX and Cross-Site Scripting to Read the HeaderAJAX 和跨站点脚本读取标题
【发布时间】:2011-04-04 11:30:34
【问题描述】:

帮助我更好地理解 AJAX 和跨站点脚本。编写 AJAX 相当简单。如果我想异步读取网站的 HTTP 标头,我会这样做:

var req = new XMLHttpRequest();
req.open('HEAD', 'http://www.stackoverflow.com/', true);
req.onreadystatechange = function (aEvt) {
  if (req.readyState == 4) {
     if(req.status == 200)
      alert(req.responseText);
     else
      alert("Error loading page");
  }
};
req.send(null);

但是,当我使用记事本将其复制并粘贴到一个简单的 HTML 页面中并尝试在本地运行时,请求状态似乎没有返回 200。我假设这是由于跨站点脚本造成的。我将如何解决这个问题?

【问题讨论】:

    标签: javascript ajax http scripting cross-domain


    【解决方案1】:

    您是对的,除非您使用跨域资源共享 (CORS, http://www.w3.org/TR/cors/),否则不允许跨域发出请求。 CORS 具有客户端和服务器端组件。在客户端,请求看起来很像常规的 XmlHttpRequest,除了您可以配置一些其他属性和处理程序。在服务器上,响应需要发出一些特殊的 http 标头。本文详细介绍了 CORS 在客户端和服务器上的工作方式:http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/

    【讨论】:

      【解决方案2】:

      我的第一个猜测是尝试制作一个充当网关的本地 PHP 文件:

      <?php
        echo get_headers($_GET['url']);
      ?>
      

      然后,以你的目标站点的url为参数执行GET请求,并解析那个请求的.responseText以确定你原来的响应头。

      我认为 pure JS 不可能,所以你必须使用一些服务器端代码。

      【讨论】:

        【解决方案3】:

        “本地”有两种:

        • 使用本地服务器 (http://localhost/)
        • 直接访问 HTML 文件 (file:///C:\a\b\c.html)

        在第二种情况下,AJAX 永远不会工作。

        【讨论】:

          【解决方案4】:

          如果您的页面在 http://localhost/ 上提供服务,则您无法向 http://stackoverflow.com 发出 ajax 请求...

          http://en.wikipedia.org/wiki/XMLHttpRequest#Cross-domain_requests

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-07
            • 1970-01-01
            • 2010-09-18
            • 2015-10-22
            相关资源
            最近更新 更多