CORS无法在Chrome上运行

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

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

调用错误函数,并使用有用的消息“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"} ); 

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

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

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

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

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

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

II。 将其重新打开,重新加载应用程序,如果API成功,请停在此处,无需继续执行iii。

III。 但是,如果您仍然获得CORS拒绝,请卸载Chrome并安装最新的Chrome。

IV。 在新的Chrome上,以前安装的CORS插件应该仍然存在,但处于OFF状态。

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

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

如果上述步骤在您的情况下仍不起作用,则无其他想法。

我也在server.js(Node)上尝试过以下操作但仍然无法正常工作,所以不用费心去尝试:

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

CORS适用于chrome。 只需使用chrome是安全模式,即使用禁用安全设置。 谷歌它,或者你甚至可以从命令行开始。