ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在尝试获取新闻网站的提要。以为我会使用谷歌的提要 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”标头。因此,不允许访问源“http://localhost”。

我该如何解决?

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

C
Community

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

您可以找到将在您的应用程序中动态修改 CORS 标头的 Chrome extension。显然,这只是 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 上使用。
A
Amirhossein Mehrvarzi

我认为这可能是 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 扩展访问,该怎么办?
P
Pang

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

E
Email

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
K
Keshav Pradeep Ramanath

解决它们的另一种方法是在包含 '@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);
        
    }

v
vancy-pants

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

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

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


M
Martijn Pieters

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

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

然后全部完成。


显然这仅适用于 dotnet 核心后端
O
Om.

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

K
Kamil Kiełczewski

对于开发,您可以使用 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();控制台.log(r); } 读();


M
Mo0rteza

好吧,另一种方法是使用 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。然后它发出请求以获取该服务器的响应。最后,代理应用

访问控制允许来源:*

对那个最初的回应。

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

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


截至 2021 年 1 月 31 日,cors-anywhere 由于滥用而受到限制,通常不应在生产中使用,除非您每天的请求数量非常有限。 github.com/Rob--W/cors-anywhere/issues/301
T
ThisaruG

请在 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 注释。致所有投反对票的人:请说出你的理由!
虽然这个答案对于这个特定问题有点偏离主题,但它确实解决了我的问题。