缺少CORS标题“Access-Control-Allow-Origin”

时间:2015-07-07 18:09:53

标签: jquery ajax json cors jsonp

我正在从我的asp.net表单中调用此函数,并在调用ajax时在firebug控制台上收到以下错误。

  

阻止跨源请求:同源策略禁止在http://anotherdomain/test.json读取远程资源。 (原因:缺少CORS标题'Access-Control-Allow-Origin'。

var url= 'http://anotherdomain/test.json';
        $.ajax({
            url: url,
            crossOrigin: true,
            type: 'GET',
            xhrFields: { withCredentials: true },
            accept: 'application/json'
        }).done(function (data) {
            alert(data);                
        }).fail(function (xhr, textStatus, error) {
            var title, message;
            switch (xhr.status) {
                case 403:
                    title = xhr.responseJSON.errorSummary;
                    message = 'Please login to your server before running the test.';
                    break;
                default:
                    title = 'Invalid URL or Cross-Origin Request Blocked';
                    message = 'You must explictly add this site (' + window.location.origin + ') to the list of allowed websites in your server.';
                    break;
            }
        });

我已经采取了替代方式,但仍无法找到解决方案。

注意:我没有服务器权限来进行服务器端(API / URL)更改。

8 个答案:

答案 0 :(得分:46)

当您尝试访问其他域的资源时,通常会发生这种情况。

这是一项安全功能,可以避免每个人自由访问该域的任何资源(可以访问该域,例如在盗版域上拥有完全相同的网站副本)。

响应的标题,即使它是200OK也不允许其他来源(域,端口)访问资源。

如果您是两个域的所有者,则可以解决此问题:

解决方案1:通过.htaccess

要更改此设置,您可以在请求的域文件的.htaccess中写入此内容:

    <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
    </IfModule>

解决方案2:以正确的方式设置标题

如果将此设置为所请求文件的响应标头,您将允许每个人访问资源:

Access-Control-Allow-Origin : *

OR

Access-Control-Allow-Origin : http://www.my-domain.com

和平与代码;)

答案 1 :(得分:6)

在你的ajax请求中

,添加:

dataType: "jsonp",

后行:

type: 'GET',

应该解决这个问题..

希望这能帮到你

答案 2 :(得分:3)

您必须修改服务器端代码,如下所示

public class CorsResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext,   ContainerResponseContext responseContext)
    throws IOException {
        responseContext.getHeaders().add("Access-Control-Allow-Origin","*");
        responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");

  }
}

答案 3 :(得分:1)

服务器端将其放在.php之上:

 header('Access-Control-Allow-Origin: *');  

您可以设置特定的域限制访问权限:

header('Access-Control-Allow-Origin: https://www.example.com')

答案 4 :(得分:0)

在完成上述答案后,你一定知道为什么会遇到这个问题。

self.send_header('Access-Control-Allow-Origin', '*')

您只需在服务器端添加上述行。

答案 5 :(得分:0)

这对我有用:

创建 php 文件,无需使用 js 即可下载另一个域页面的内容:

<?
//file name: your_php_page.php
echo file_get_contents('http://anotherdomain/test.json');
?>

然后在ajax(jquery)中运行。示例:

$.ajax({
  url: your_php_page.php,
  //optional data might be usefull
  //type: 'GET',
  //dataType: "jsonp", 
  //dataType: 'xml',
  context: document.body
}).done(function(data) {

  alert("data");
  
}); 

答案 6 :(得分:0)

紧急情况下,您可以使用此 Chrome 扩展程序在本地浏览器上禁用 CORS。

Allow CORS: Access-Control-Allow-Origin Chrome Extension

答案 7 :(得分:-11)

您的浏览器不允许您的请求.. 您需要在网络浏览器上安装插件

对于Chrome: https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en

适用于Firefox https://addons.mozilla.org/en-US/firefox/addon/cors-everywhere/

最佳方式 你可以在服务器端添加标题

Access-Control-Allow-Origin:*