请求的资源错误中不存在“ Access-Control-Allow-Origin”标头


93

我正在尝试获取新闻网站的供稿。以为我会使用Google的feed API将feedburner供稿转换为json。以下网址将以json格式从Feed中返回10个帖子。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”标头。因此,不允许访问源“ http:// localhost ”。

我该如何解决?


1
我在这里使用Chrome测试了您的代码,并按预期工作。您是否尝试过使用“ crossDomain:true”属性?
Daniel Loureiro

我在这里托管了您的代码:learningwithdaniel.com/test.html。看看您是否可以正确打开。如果未收到错误,则服务器可能会出现问题
Daniel Loureiro

大。因此,它与浏览器请求此html时服务器发送的标头有关。检查“ cors标头”
Daniel Loureiro

与Godaddy API相同
吉尔森·吉尔伯特

这个问题不是重复的吗?stackoverflow.com/questions/20035101/…更重要的是,另一个问题的答案更为清晰/彻底。
红豌豆

Answers:


85

我认为这可能是因为Chrome不支持localhost通过Access-Control-Allow-Origin- 请参阅Chrome问题

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

127.0.0.1   localhost yourdomain.com

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


谢谢。我遇到此问题并切换到IE Edge,导致我看到服务器代码中的潜在错误,该错误已被Chrome拒绝localhost所掩盖。
阿兰·哈达德

7
也不适合我。也许Chrome的更新阻止了这个“漏洞”?
Marty C.

2
这里也没有帮助。我的网站已经以这种方式设置,但是我确实有很大的不同。我正在使用其他端口。我确定它是同一端口,是否可以工作。HTTP与HTTPS当然是不同的端口,因此这可能会引起一些问题。我穿的不是HTTPS特别,但我想访问的东西在同一个域,但其他不同的端口80
杰里道奇

如果Chrome扩展程序正在访问API,该怎么办
viveksinghggits

111

如果您使用的是Google Chrome浏览器,则可以使用扩展程序进行入侵。

您可以在应用程序中找到一个可以即时修改CORS标头的Chrome扩展程序。显然,这仅是Chrome浏览器,但我喜欢它在任何地方都零变化的情况下工作。

您可以将其用于在本地计算机上调试应用程序(如果一切都可以在生产环境中运行)。

注意:如果URL断开,扩展名是Access-Control-Allow-Origin:*。我建议您在不使用自己的东西时禁用此扩展程序,例如,因为youtube不适用于该扩展程序。


这肯定也对我有用!...我认为该插件的开发人员已对其进行了更新,以使其适合您手动输入的某些网址,而不是针对所有内容,我访问了Youtube和其他网站,并且效果很好。反正非常感谢。
金斯顿财富

1
它仅用于开发时的测试。用户不会添加插件的浏览器
图片说明纽特

似乎该扩展名不再可用,至少在该URL处不可用。但是,此扩展程序似乎可以正常工作:chrome.google.com/webstore/detail/allow-cors-access-control/…–
Gordon

但是这个扩展在做什么?您是否知道开放源代码版本,或者该怎么写以这种方式修改标头的版本?您可能不想(好吧,不想)运行一个扩展程序,该扩展程序可以完全访问URL和数据,而不知道它在做什么。如果扩展名易手,已经很有害等话,这似乎是一个非常糟糕的主意。编辑: 下面提到的开放源代码,fwiw。
鲁芬

9

试试这个-通过设置标头来设置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

1

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

由于浏览器安全性的限制,大多数“ Ajax”请求都受相同的原始策略约束;该请求无法从其他域,子域,端口或协议成功检索数据。

更改主机文件(如@thanix)对我不起作用,但是@dkruchok提到的扩展名确实解决了该问题。


0

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

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

然后全部完成。


显然,这仅适用于dotnet核心后端
las,

0

如果其调用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);
        }
    };
}


0

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

这是Google Chrome的插件,名为“ cors unblock”

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

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


0

好吧,另一种方式是使用cors代理,您只需在URL之前添加https://cors-anywhere.herokuapp.com/,因此您的URL就像https://cors-anywhere.herokuapp.com/http ://ajax.googleapis.com/ajax/services/feed/load

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

Access-Control-Allow-Origin: *

对最初的回应。

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

您可以在“中等3种解决CORS错误的方法 ”中阅读有关此解决方案的更多信息


-5

请使用@CrossOriginbackendside春季引导控制器(或者类级别或方法级)作为铬错误溶液'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注释。对于所有反对的人:请说明您的理由!
rwenz3l
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.