Javascript CORS不在铬上工作

Javascript CORS不在铬上工作,javascript,jquery,google-chrome,cors,Javascript,Jquery,Google Chrome,Cors,我已经在服务器上设置了跨源资源共享(Jetty使用CrossOriginFilter),它在IE8和Firefox上运行得非常好。在Chrome上,它只是。。。没有 $.ajax({ url : crossOriginURL, type : "GET", error : function(req, message) { alert(message); }, dataType : "json" } ); 将调用error函数,并显示有用的消息

我已经在服务器上设置了跨源资源共享(Jetty使用CrossOriginFilter),它在IE8和Firefox上运行得非常好。在Chrome上,它只是。。。没有

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

将调用error函数,并显示有用的消息“error”。它似乎在发出请求,但没有任何您期望的标题。如果URL来自同一个来源,它就可以正常工作。

我用这种方法解决了我的问题:

将此添加到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"} );

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

编辑:服务器需要添加
访问控制允许标题:内容类型
以避免此问题


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

看起来原始海报可能已经解决了他们的问题,但对于任何与评论员Elisabeth有相同问题的人来说,我相信问题可能在于,如果您从本地文件运行请求,Chrome拒绝为CORS请求设置原始标头。它甚至不允许您显式覆盖原始标头。这会导致服务器看到“Origin:null”,这在大多数情况下会导致403。Firefox显然没有这样的限制,我在做了很多尝试后发现了这一点


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

CORS将在Chrome中工作。仅使用chrome是安全模式,即使用禁用安全设置。
用谷歌搜索一下,或者你也可以从命令行开始。

在我的例子中,是localhost:8001(前端),它试图调用localhost:7001(在server.js上作为节点服务器)上的API。即使我在Chrome上安装了CORS插件并打开了它,但CORS政策仍然拒绝将其作为飞行前案例

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

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

二,。重新打开,重新加载应用程序,如果API成功,请停止此处,无需继续iii

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

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

五,。重新加载页面,您应该在控制台上获得正确的CORS拒绝消息

vi.重新打开,重新加载页面,错误应该消失

如果上述步骤在您的案例中仍然不起作用,则没有进一步的想法

我还在server.js(Node)上尝试了以下操作,但仍然不起作用,因此不必费心尝试:

var app = express();
var cors = require('cors'); // Already done “npm i cors --save-dev”
app.options('*', cors());

当我更新chrome时,我遇到了这个问题,我已经解决了它,谷歌扩展版“访问控制允许凭据”的新版本。如果它是一个旧版本,你将不需要在一个新的谷歌浏览器版本上工作


检查以确保您没有将服务器设置为“允许凭据”,并将“允许来源”标题设置为*。如下图所示:

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
如果您的服务器正在为这些头返回这些值,那么它将无法工作。如果将
访问控制允许凭据
设置为
,则不能将
*
用作
访问控制允许来源
标题的值。以下是标题()的MDN webdocs摘录:

如果是上述情况,只需将
访问控制允许凭据设置为
false

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: false
工具书类

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

Malvolio和CuSS是同一个人?不!当然不是!哈哈,今天早上我和他有同样的问题。我迫切需要解决这个问题,所以为了不重复这个问题,我对他的问题很感兴趣,但既然我现在已经解决了这个问题,我必须回答他。对不起,我的英语不好。实际上,最终对我有效的是xhr.setRequestHeader('Content-Type','text/plain');在这种情况下,你能发布你自己的答案并将其标记为正确答案吗?(我没有这个特别的问题,但我喜欢保持未回答问题的列表干净)我的答案适用于所有浏览器。您不需要请求自定义标题,因为限制或不限制页面的是服务器和浏览器引擎。。。如果您收到一个空白响应,很可能是ajax上的错误数据类型,这是因为您没有选择正确的数据类型。阅读中的数据类型。在ajax选项数组中,放置{dataType:“text”}将内容类型设置为plain的解决方案对我不起作用(我收到一个错误,表明我无法在请求中设置它)。我不是在写我自己的服务器服务,而是在使用另一个在线服务(twitter)。是否有其他仅使用JavaScript的解决方案?我还尝试使用与上面相同的技术(设置请求头)将“origin”设置为特定的内容,但出现了一个错误。我的代码在Safari中运行得很好,但在Chrome中失败了,尽管所有迹象都表明Chrome支持CORS。@该死的完美答案!我已经在服务器端包含了上述标题。仍然无法通过
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: false