34

我已经在服务器(使用 CrossOriginFilter 的 Jetty)上设置了跨域资源共享,它在 IE8 和 Firefox 上完美运行。在 Chrome 上,它只是......没有。

  $.ajax({ url : crossOriginURL,
    type : "GET",
    error : function(req, message) {
        alert(message);
    },
    dataType :  "json" } );

调用错误函数,并带有有用的消息“错误”。它似乎正在发出请求,但没有您期望的任何标头。如果 URL 来自同一来源,则可以正常工作。

4

8 回答 8

26

我以这种方式解决了我的问题:

将此添加到您的 PHP 代码中:

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true ");
header("Access-Control-Allow-Methods: OPTIONS, GET, POST");
header("Access-Control-Allow-Headers: Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control");

或者将这些标题添加到您的响应中。

问题:浏览器在您的主要请求之前向服务器询问选项,以检查站点是否可以选择允许与不同来源的通信,如果是,它们会执行您的 POST 或 GET 请求。

编辑:试试这个(没有你的黑客)看看你是否正在接收数据......

$.ajax({ url : crossOriginURL,
    type : "GET",
    error : function(req, message) {
        alert(message);
    },
    success : function(data) {
        alert(data);
    },
    dataType :  "text"} );
于 2010-08-30T11:59:09.400 回答
19

最终对我有用的是xhr.setRequestHeader('Content-Type', 'text/plain');

编辑:服务器需要添加Access-Control-Allow-Headers: Content-Type以避免这个问题。

十年后我又回到了我自己的问题上。我不知道这是好事还是坏事。

于 2011-08-29T10:17:13.233 回答
14

看起来原始发布者可能已经解决了他们的问题,但是对于与评论员 Elisabeth 有相同问题的任何人,我认为问题可能是如果您从本地文件。它甚至不允许您显式覆盖 Origin 标头。这会导致服务器看到“Origin:null”,在大多数情况下会导致 403。Firefox 显然没有这样的限制,正如我在费尽心思之后发现的那样。

如果您在这种情况下绝对需要使用 Chrome,您可以通过在本地运行网络服务器并始终通过 http: 而不是通过 file: 访问您的文件来解决您的问题。

于 2012-10-31T08:58:50.960 回答
2

当我更新 chrome 时我遇到了问题,我已经解决了谷歌扩展“Access-Control-Allow-Credentials”新版本。如果是旧版本,则无需使用新的 Google Chrome 版本

https://chrome.google.com/webstore/detail/access-control-allow-cred/hmcjjmkppmkpobeokkhgkecjlaobjldi?hl=en

于 2019-04-20T08:48:16.407 回答
1

检查以确保您没有将服务器设置为允许凭据并将允许来源标头设置为 *. 如下所示:

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

如果您的服务器为这些标头返回这些值,那么它将不起作用。如果设置Access-Control-Allow-Credentialstrue,则不能*用作标头的值Access-Control-Allow-Origin。以下是 MDN webdocs 的标题摘录(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin):

For requests without credentials, the literal value "*" can be specified, as a wildcard; 
the value tells browsers to allow requesting code from any origin to access the resource. 
Attempting to use the wildcard with credentials will result in an error.

如果是上述情况,只需设置Access-Control-Allow-Credentialsfalse

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: false

参考

于 2019-05-10T07:44:48.067 回答
0

我们实际上有两个域,一个是仪表板dashboard.app.com,另一个是公共网站app.com。请求来自公共网站,PHP 路由重定向到仪表板域,这就是我们收到错误的原因。解决方案是将所有请求保留在同一个域中,而不需要重定向。

于 2021-05-21T05:01:03.533 回答
-1

就我而言,它是 localhost:8001 (前端),它尝试在 localhost:7001 (在 server.js 作为节点服务器上)调用 API。即使我在 Chrome 上安装并打开了 CORS 插件,但 CORS 政策仍然拒绝将它们作为预检案例。

我花了半天多的时间才终于解决了这个问题。不管你信不信,这里是“愚蠢”的步骤:

一世。关闭 CORS 插件,重新加载应用程序,此时您应该仍然得到正确的错误。

ii. 重新打开,重新加载应用程序,如果 API 成功,则在此处停止,无需继续执行 iii。

iii. 但是,如果您仍然收到 CORS 拒绝,请卸载 Chrome 并安装最新的 Chrome。

iv. 在新的 Chrome 上,之前安装的 CORS 插件应该仍然存在,但处于关闭状态。

v. 重新加载页面,您应该会在控制台上看到正确的 CORS 拒绝消息。

六。重新打开,重新加载页面,错误应该消失。

如果上述步骤在您的情况下仍然不起作用,则没有进一步的想法。

我还在 server.js (Node) 上尝试了以下操作,但仍然无法正常工作,因此无需尝试:

var app = express();
var cors = require('cors'); // Already done “npm i cors --save-dev”
app.options('*', cors());
于 2017-10-11T20:16:06.643 回答
-9

CORS 将在 chrome 中工作。只需使用 chrome 是安全模式,即使用禁用安全设置。谷歌一下,或者你甚至可以从命令行开始。

于 2013-05-27T11:51:12.807 回答