【问题标题】:No 'Access-Control-Allow-Origin' header is present on the requested resource error请求的资源错误中不存在“Access-Control-Allow-Origin”标头
【发布时间】:2015-04-17 07:26:17
【问题描述】:

我正在尝试获取新闻网站的提要。以为我会使用谷歌的提要 API 将 feedburner 提要转换为 json。以下网址将从提要中返回 10 篇 json 格式的帖子。 http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http://feeds.feedburner.com/mathrubhumi

我使用下面的代码来获取上面url的内容

$.ajax({
  type: "GET",
  dataType: "jsonp",
  url: "http://ajax.googleapis.com/ajax/services/feed/load",
  data: {
    "v": "1.0",
    "num": "10",
    "q": "http://feeds.feedburner.com/mathrubhumi"
  },
  success: function(result) {
    //.....
  }
});

但它不起作用,我收到以下错误

XMLHttpRequest 无法加载 http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http%3A%2F%2Ffeeds.feedburner.com%2Fmathrubhumi。 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此,不允许访问 Origin 'http://localhost'。

我该如何解决这个问题?

【问题讨论】:

  • 我在这里测试了您的代码,使用 Chrome 并按预期工作。您是否尝试过使用“crossDomain: true”属性?
  • 我在这里托管了您的代码:learnwithdaniel.com/test.html。看看能不能正常打开。如果您没有收到错误,则问题出在您的服务器上
  • 太棒了。因此,它与您的浏览器请求此 html 时服务器发送的标头有关。检查“cors headers”
  • 这里和godaddy api一样
  • 这个问题不是重复的吗? stackoverflow.com/questions/20035101/… 更重要的是,this other question有更清晰/更彻底的答案。

标签: javascript jquery json ajax cors


【解决方案1】:

如果您使用 Google Chrome 浏览器,您可以使用扩展程序破解。

您可以找到Chrome extension,它将在您的应用程序中即时修改 CORS 标头。显然,这只是 Chrome,但我喜欢它可以在任何地方进行零更改。

您可以使用它在本地计算机上调试您的应用程序(如果一切都在生产环境中正常运行)。

通知: 如果 URL 损坏,则扩展名是 Access-Control-Allow-Origin: *。我建议您在不处理内容时禁用此扩展程序,因为例如 youtube 不适用于此扩展程序。

【讨论】:

  • 这绝对对我有用!...我认为插件的开发人员已经更新了它以适应您手动输入的某些 url 而不是为所有东西工作,我访问了 Youtube 和其他网站,它只是工作美好的。无论如何,非常感谢。
  • 仅用于开发测试。用户不会在浏览器中添加插件
  • 看起来该扩展程序不再可用,至少在该 URL 处。然而,这个扩展似乎可以工作:chrome.google.com/webstore/detail/allow-cors-access-control/…
  • 但是这个扩展在做什么?您是否知道开源版本或如何编写以这种方式修改标头的版本?您可能不希望(好吧, 不希望)运行一个可以完全访问 URL 和数据而不知道它在做什么的扩展。如果扩展程序易手,已经是邪恶的等等,这似乎是一个非常的坏主意。编辑:The one mentioned belowopen source,fwiw。
  • @ruffin 感谢您指出这一点!此外,值得一提的是,这个开源的 Chrome 插件 CORS Unblock 也可以在 Firefox 和 Microsoft Edge 上使用。
【解决方案2】:

我相信这可能是Chrome不支持localhost通过Access-Control-Allow-Origin——see Chrome issue

要让 Chrome 在标头中发送 Access-Control-Allow-Origin,只需将 /etc/hosts 文件中的 localhost 别名为其他域,例如:

127.0.0.1   localhost yourdomain.com

然后,如果您使用yourdomain.com 而不是localhost 访问您的脚本,调用应该会成功。

【讨论】:

  • 谢谢。我遇到了这个问题并切换到 IE edge,导致我看到我的服务器代码中的潜在错误被 Chrome 拒绝本地主机所掩盖。
  • 对我也不起作用。也许 Chrome 的更新阻止了这个“漏洞”?
  • 这里也没有帮助。我的网站已经以这种方式设置,但是我确实有一个很大的不同。我正在使用不同的端口。我敢肯定,如果它是同一个端口,它会工作。 HTTP 与 HTTPS 当然是不同的端口,所以这可能会导致你们中的一些问题。我的不是 HTTPS,但我正在尝试访问同一域上的某些内容,但使用 80 以外的不同端口。
  • 如果API被chrome扩展访问了怎么办
【解决方案3】:

试试这个 - 通过如下设置标头来设置 Ajax 调用:

var uri = "http://localhost:50869/odata/mydatafeeds"
$.ajax({
    url: uri,
    beforeSend: function (request) {
        request.setRequestHeader("Authorization", "Negotiate");
    },
    async: true,
    success: function (data) {
        alert(JSON.stringify(data));
    },
    error: function (xhr, textStatus, errorMessage) {
        alert(errorMessage);
    }                
});

然后通过使用以下命令行打开 Chrome 来运行您的代码:

chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security

【讨论】:

    【解决方案4】:

    cors unblock 适用于 chrome 78 [CORs unb] [1] https://chrome.google.com/webstore/detail/cors-unblock/lfhmikememgdcahcdlaciloancbhjino

    这是一个名为“cors unblock”的谷歌浏览器插件

    总结: 启用后,通过将“Access-Control-Allow-Origin: *”标头附加到本地和远程 Web 请求,不再出现 CORS 错误

    此扩展通过为浏览器接收的每个请求提供自定义的“access-control-allow-origin”和“access-control-allow-methods”标头来控制 XMLHttpRequest 和 fetch 方法。用户可以从工具栏按钮打开和关闭扩展。要修改这些标题的更改方式,请使用右键单击上下文菜单项。您可以自定义允许的方法。默认选项是允许“GET”、“PUT”、“POST”、“DELETE”、“HEAD”、“OPTIONS”、“PATCH”方法。您还可以要求扩展在服务器已经填充这些标头时不要覆盖它们。

    【讨论】:

    • 正如上面的另一位评论者this plugin is opensource 所指出的,考虑到这种插件可以访问所有 URL,这非常好,因此透明度值得赞赏。它也可在 Firefox 和 Microsoft Edge 上使用。很好的发现!谢谢分享!
    • 这是一个很棒的 Web 开发扩展!非常感谢你! :)
    • 欢迎 :) @ScottMilella
    【解决方案5】:

    仅供参考,我从 jQuery 文档中注意到此信息,我认为该信息适用于此问题:

    由于浏览器安全限制,大多数“Ajax”请求都受same origin policy的约束;请求无法从不同的域、子域、端口或协议成功检索数据。

    像@thanix 这样更改主机文件对我不起作用,但@dkruchok 提到的扩展确实解决了问题。

    【讨论】:

      【解决方案6】:

      Chrome 不允许您集成两个不同的本地主机,这就是我们收到此错误的原因。您只需包含来自 nuget 管理器的 Microsoft Visual Studio Web Api Core 包。并在您的 WebApiConfig.cs 文件中的 WebApi 项目中添加两行代码。

      var cors = new EnableCorsAttribute("*", "*", "*");
      config.EnableCors(cors);
      

      然后全部完成。

      【讨论】:

      • 显然这仅适用于 dotnet 核心后端
      【解决方案7】:

      如果它调用 spring boot 服务。你可以使用下面的代码来处理它。

      @Bean
      public WebMvcConfigurer corsConfigurer() {
          return new WebMvcConfigurerAdapter() {
              @Override
              public void addCorsMappings(CorsRegistry registry) {
                  registry.addMapping("/**")
                          .allowedOrigins("*")
                          .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS")
                          .allowedHeaders("*", "Access-Control-Allow-Headers", "origin", "Content-type", "accept", "x-requested-with", "x-requested-by") //What is this for?
                          .allowCredentials(true);
              }
          };
      }
      

      【讨论】:

        【解决方案8】:

        开发可以使用https://cors-anywhere.herokuapp.com,生产最好设置自己的代理

        async function read() {
           let r= await (await fetch('https://cors-anywhere.herokuapp.com/http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http://feeds.feedburner.com/mathrubhumi')).json();
           console.log(r);
        }
        
        read();

        【讨论】:

          【解决方案9】:

          好吧,另一种方法是使用 cors 代理,您只需在 URL 前添加 https://cors-anywhere.herokuapp.com/。这样您的 URL 将类似于 https://cors-anywhere.herokuapp.com/http://ajax.googleapis.com/ajax/services/feed/load

          代理服务器从上面的 URL 接收http://ajax.googleapis.com/ajax/services/feed/load。然后它发出请求以获取该服务器的响应。最后,代理应用

          Access-Control-Allow-Origin: *

          回复原始回复。

          这个解决方案很棒,因为它在开发和生产中都适用。总之,您正在利用同源策略仅在浏览器到服务器通信中实现的事实。这意味着它不必在服务器到服务器的通信中强制执行!

          您可以在 Medium 3 Ways to Fix the CORS Error 上阅读有关解决方案的更多信息

          【讨论】:

          【解决方案10】:

          解决它们的另一种方法是在包含'@SpringBootApplication' 的主应用程序类中添加以下代码,并在需要时重新启动服务器。这对我有用。

              @Bean
              public CorsFilter corsFilter() {
                  CorsConfiguration corsConfiguration = new CorsConfiguration();
                  corsConfiguration.setAllowCredentials(true);
                  corsConfiguration.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
                  corsConfiguration.setAllowedHeaders(Arrays.asList("Origin","Access-Control-Allow-Origin",
                          "Content-Type","Accept","Authorization","Origin,Accept","X-Requested-With",
                          "Access-Control-Request-Method","Access-Control-Request-Headers"));
                  corsConfiguration.setExposedHeaders(Arrays.asList("Origin","Content-Type","Accept","Authorization",
                          "Access-Control-Allow-Origin","Access-Control-Allow-Origin","Access-Control-Allow-Credentials"));
                  corsConfiguration.setAllowedMethods(Arrays.asList("GET","PUT","POST","DELETE","OPTIONS"));
                  UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
                  urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
                  return new CorsFilter(urlBasedCorsConfigurationSource);
                  
              }
          

          【讨论】:

            【解决方案11】:

            请在 Spring 启动控制器(类级别或方法级别)中的 backendside 上使用 @CrossOrigin,作为 Chrome 错误的解决方案 'No 'Access-Control-Allow-Origin' 标头存在于请求的资源上。'

            这个解决方案 100% 对我有用 ...

            示例:类级别

            @CrossOrigin
            @Controller
            public class UploadController {
            

            ----- 或 --------

            示例:方法级别

            @CrossOrigin(origins = "http://localhost:3000", maxAge = 3600)
            @RequestMapping(value = "/loadAllCars")
                @ResponseBody
                public List<Car> loadAllCars() {
            
            
            Ref: https://spring.io/blog/2015/06/08/cors-support-in-spring-framework
            

            【讨论】:

            • 虽然这当然不能回答 OP 的问题,但它有一个有效的观点。通过 javascript 使用 Spring RESTful Services/Data 确实需要您设置 @CrossOrigin 注释。致所有投反对票的人:请说出你的理由!
            • 虽然这个答案对于这个特定问题来说有点离题,但它确实解决了 my 问题。
            猜你喜欢
            • 2017-12-16
            • 2015-07-29
            • 1970-01-01
            • 2020-11-08
            • 2016-11-25
            • 2015-04-04
            相关资源
            最近更新 更多