Javascript 否';访问控制允许原点';请求的资源错误上存在标头

Javascript 否';访问控制允许原点';请求的资源错误上存在标头,javascript,jquery,json,ajax,cors,Javascript,Jquery,Json,Ajax,Cors,我正试图获取一个新闻网站的提要。我想我应该使用google的FeedAPI将feedburner提要转换为json。以下url将以json格式从提要返回10篇文章 我使用以下代码获取上述url的内容 $.ajax({ type: "GET", dataType: "jsonp", url: "http://ajax.googleapis.com/ajax/services/feed/load", data: { "v": "1.0", "num": "10",

我正试图获取一个新闻网站的提要。我想我应该使用google的FeedAPI将feedburner提要转换为json。以下url将以json格式从提要返回10篇文章

我使用以下代码获取上述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 . 请求的服务器上不存在“Access Control Allow Origin”标头 资源。因此,不允许访问源“”


如何解决此问题?

我相信这可能是因为Chrome不支持
localhost
通过
Access Control Allow Origin
--

要让Chrome发送
Access Control Allow Origin
,只需将/etc/hosts文件中的本地主机别名为其他域,如:

127.0.0.1   localhost yourdomain.com

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

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

如果你使用Google Chrome浏览器,你可以通过扩展进行黑客攻击

您可以在应用程序中找到一个可以动态修改CORS头的。显然,这只是Chrome,但我喜欢它在任何地方都不会有任何变化

你可以使用它在本地机器上调试你的应用程序(如果一切正常的话)

注意
如果URL断开,则扩展名为。我建议您在不处理您的资料时禁用此扩展,因为例如,youtube不使用此扩展。

请在Spring boot controller(类级或方法级)的
后端
上使用
@CrossOrigin
作为Chrome错误的解决方案,请求的资源上存在“否”访问控制允许来源“
头。”

这个解决方案100%适用于我

示例:班级级别

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

示例:方法级别

@交叉原点(原点=”http://localhost:3000,maxAge=3600)
@请求映射(value=“/loadAllCars”)
@应答器
公共列表loadAllCars(){
裁判:https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

Chrome不允许您集成两个不同的本地主机,这就是我们出现此错误的原因。您只需包含nuget manager提供的Microsoft Visual Studio Web Api核心包。然后将WebApi项目中的两行代码添加到您的
WebApiConfig.cs
文件中

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

然后全部完成。

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

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


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

如果它调用spring引导服务。您可以使用以下代码处理它

@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);
        }
    };
}

对于您可以使用的开发,对于生产,最好设置您自己的代理

异步函数读取(){ 设r=wait(wait-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(); 控制台日志(r); }
read();
cors解锁对chrome 78非常有效 [COrs unb] [1]

这是谷歌chrome的一个插件,名为“cors unblock”

摘要: 启用时,通过向本地和远程web请求附加“访问控制允许源:*”标题,不再出现CORS错误


此扩展通过提供自定义的“访问控制允许源”和“访问控制允许方法”来控制XMLHttpRequest和fetch方法浏览器接收到的每个请求的标题。用户可以从工具栏按钮打开和关闭扩展。若要修改这些标题的更改方式,请使用右键单击上下文菜单项。您可以自定义允许的方法。默认选项是允许“获取”、“放置”、“发布”、“删除”、“标题”、“选项”、“修补”方法。您可以当服务器已经填充这些标题时,您还可以要求扩展插件不要覆盖这些标题。

好的,另一种方法是使用cors代理,您只需要在URL之前添加。因此,您的URL类似于

代理服务器从上面的URL接收请求。然后它发出请求以获取该服务器的响应。最后,代理应用

访问控制允许原点:

对最初的答复

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


您可以在Medium上阅读更多关于此解决方案的信息

另一种解决方法是在主应用程序类中添加以下代码,该类包含
'@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);
        
    }

我在这里用Chrome测试了你的代码,并按预期工作。你试过使用“crossDomain:true”吗属性?我在此处托管了您的代码:。请查看是否可以无错误地打开。如果没有错误,则问题出在您的服务器上。很好。因此,它与您的浏览器请求此html时服务器发送的标题有关。请检查“cors标题”与godaddy Api相同,这个问题不是重复的吗?更重要的是,另一个问题有更清晰/更彻底的答案。谢谢。我遇到了这个问题并切换到IE edge,因为
@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);
        }
    };
}
    @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);
        
    }