Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 跨来源资源共享(CORS)概念_Javascript_Jquery_Ajax_Cors - Fatal编程技术网

Javascript 跨来源资源共享(CORS)概念

Javascript 跨来源资源共享(CORS)概念,javascript,jquery,ajax,cors,Javascript,Jquery,Ajax,Cors,我对跨域JavaScript的概念有一个疑问 有一个服务器(例如amazon.com),在这个服务器中,只有选定的域才能使用其web服务。 所以,毫无疑问,如果我试图使用他们的服务,从我的本地,我不能。 我把这个放在控制台上了 已阻止跨源请求:同一源策略不允许读取 位于的远程资源 . 这可以通过将资源移动到同一域或域来解决 启用CORS PS:我也使用了jquery跨域的方式,但不起作用 但是,如果某个被选中的域(使用Amazon的Web服务)具有JavaScript,如果我们将其包含在html

我对跨域JavaScript的概念有一个疑问

有一个服务器(例如amazon.com),在这个服务器中,只有选定的域才能使用其web服务。 所以,毫无疑问,如果我试图使用他们的服务,从我的本地,我不能。 我把这个放在控制台上了

已阻止跨源请求:同一源策略不允许读取 位于的远程资源 . 这可以通过将资源移动到同一域或域来解决 启用CORS

PS:我也使用了jquery跨域的方式,但不起作用

但是,如果某个被选中的域(使用Amazon的Web服务)具有JavaScript,如果我们将其包含在html中,它就会工作

<script src="http://example.com"></script>

他们有一种通过Ajax获得响应的方法

我的问题是:

  • 当我们从internet url引用JavaScript文件时会发生什么。我们的机器上有本地副本吗
  • 是创建的httpRequest,将有一个请求源作为my domain或xyz

  • CORS是必须在服务器上修改的设置。它允许外部域请求网页上的资源。简单地在客户机上更改代码不会更改CORS的功能

    您可以从“脚本”标记内访问页面的原因是,标记的处理方式与跨源请求的所有其他数据不同。在过去,您可以使用JSONP将CORS“黑客”到您的系统上,JSONP将JSON数据存储在HTML标记中

    要在Apache中启用CORS,请执行以下操作:

    首先通过键入找到httpd.conf

    ps -ef | grep apache
    
    这将为您提供Apache的位置。找到该类型后:

     <apache-location> -V
    
    现在您需要转到httpd.conf并键入“/”以搜索
    。找到标记后,请在其后面键入:

    Header set Access-Control-Allow-Origin "*"
    
    保存文件并通过运行以下命令确认语法正确:

    apachectl -t
    
    如果不符合要求,请运行优雅的重新启动命令:

    apachectl -k graceful
    
    一旦服务器重新启动,您的文件现在应该可以通过外部脚本访问

    如果由于错误而无法保存配置,请尝试退出编辑器并键入:

    sudo chmod 755 httpd.conf
    
    这使所有者可以完全访问配置文件,但其他人只能读取一个execute-it()

    要测试这些更改,请在外部服务器上创建一个新的index.html文件,并加载以下内容:

    <!doctype html>
    <html>
        <head>
        <title>TEST</title>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.18/angular.js"></script>
        <script src="http://code.jquery.com/jquery-1.11.1.js"></script>
        <!-- Insert Scripts & CSS Here -->
        <link rel="stylesheet" type="text/css" href="http://d1e24pw9mnwsl8.cloudfront.net/c/bootstrap/css/bootstrap.min.css">
        </head>
    
        <body>
    
            <script>
            jQuery.get('yourwebsite.com/file.csv', function(data) {
            document.write(data);
            });
            </script>
    
        </body>
    
    </html>
    

    这意味着a)您的httpd.conf配置不正确/未保存,或者b)您忘记重新启动web服务器

    重要注意事项:如果另一端的服务器没有启用它,那么在客户端代码中就无法执行任何允许跨源ajax请求的操作

    在回答你的问题之前,让我先介绍一下背景:

    简单地说,同源安全策略确保一个来源的脚本不能从其他来源获取内容。现在,为了向大家解释起源的概念,让我引用其中的一部分:

    下表概述了针对URL“”进行检查的典型结果

    与其他浏览器不同,Internet Explorer在计算源代码时不包括端口,而是使用安全区域

    因此,例如,您的JavaScript不能从web服务器下载任何内容(也就是,向web服务器发出HTTP请求),而不是从它起源的服务器下载。这就是为什么不能对其他域进行XmlHttpRequests(又名AJAX)的原因


    CORS是另一端的服务器(而不是浏览器中的客户端代码)可以使用的一种方式

    对……的过于简单的描述。 CORS标准的工作原理是添加新的HTTP头,允许服务器向允许的源域提供资源。浏览器支持这些标题并尊重它们所建立的限制

    示例:假设您的站点是
    http://my-cool-site.com
    而且,您在域
    http://third-party-site.com
    ,您可以通过AJAX访问它

    让我们假设您的服务器
    my cool site.com
    中的一个页面向
    third party site.com
    发出请求。通常情况下,用户浏览器会拒绝对除您自己的域/子域之外的任何其他站点的AJAX调用。但如果浏览器和第三方服务器支持CORS,则会发生以下情况:

    • 浏览器将向
      第三方站点.com

      Origin: http://my-cool-site.com
      
    • 如果第三方服务器接受来自您域的请求,它将使用
      访问控制允许源站
      HTTP头进行响应:

      Access-Control-Allow-Origin: http://my-cool-site.com
      
    • 要允许所有域,第三方服务器可以发送此标头:

      Access-Control-Allow-Origin: *
      
    • 如果您的站点不被允许,浏览器将抛出一个错误

    如果客户机具有相当现代化的功能,并且您的第三方服务器也是如此,那么CORS可能对您很有用

    在一些过时的浏览器(例如IE8)中,您必须使用特定于Microsoft的
    XDomainRequest
    对象,而不是
    XMLHttpRequest
    ,才能进行调用,以使CORS正常工作;现在,所有现代浏览器(包括微软的浏览器)都在
    XMLHttpRequest
    中处理COR。但如果您需要支持过时的浏览器,请说明:

    要发出CORS请求,只需在Firefox 3.5+、Safari 4+和Chrome中使用
    XMLHttpRequest
    ,在IE8+中使用
    XDomainRequest
    对象。当使用
    XMLHttpRequest
    对象时,如果浏览器看到您试图发出跨域请求,它将无缝触发CORS行为

    下面是一个javascript函数,可以帮助您创建跨浏览器的CORS对象

    function createCORSRequest(method, url){
        var xhr = new XMLHttpRequest();
        if ("withCredentials" in xhr){
            // XHR has 'withCredentials' property only if it supports CORS
            xhr.open(method, url, true);
        } else if (typeof XDomainRequest != "undefined"){ // if IE use XDR
            xhr = new XDomainRequest();
            xhr.open(method, url);
        } else {
            xhr = null;
        }
        return xhr;
    }
    
    同样,这只对过时的浏览器是必要的


    以上原因就是您无法从脚本中使用Amazon的web服务的原因。亚马逊服务器将只允许将其JavaScript文件下载到从选定域提供服务的页面

    要回答您的编号问题:

    • 该文件将被下载
      Access-Control-Allow-Origin: http://my-cool-site.com
      
      Access-Control-Allow-Origin: *
      
      function createCORSRequest(method, url){
          var xhr = new XMLHttpRequest();
          if ("withCredentials" in xhr){
              // XHR has 'withCredentials' property only if it supports CORS
              xhr.open(method, url, true);
          } else if (typeof XDomainRequest != "undefined"){ // if IE use XDR
              xhr = new XDomainRequest();
              xhr.open(method, url);
          } else {
              xhr = null;
          }
          return xhr;
      }
      
      Header set Access-Control-Allow-Origin *
      
      MIDDLEWARE = [
      ...
      'corsheaders.middleware.CorsMiddleware',
      ...
      ]