CORS无法在Chrome上运行

Mal*_*lio 30 javascript jquery google-chrome cors

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

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

调用错误函数,并显示有用的消息"error".它似乎正在提出请求,但没有任何你期望的标题.如果URL来自同一个来源,它可以正常工作.

cus*_*pvz 24

我这样解决了我的问题:

将其添加到您的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");
Run Code Online (Sandbox Code Playgroud)

或者将这些标题添加到您的回复中.

问题:浏览器在主要请求之前向服务器询问选项,以检查站点是否允许允许与不同来源进行通信,然后如果是,则执行POST或GET请求.

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

$.ajax({ url : crossOriginURL,
    type : "GET",
    error : function(req, message) {
        alert(message);
    },
    success : function(data) {
        alert(data);
    },
    dataType :  "text"} );
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,你可以发布自己的答案,并将其标记为正确答案吗?(我没有这个特殊的问题,但我确实希望保持未回答的问题列表清洁) (4认同)
  • @CuSS完美答案!我已经在服务器端包含了上述标题.仍然无法通过AJAX调用获取标头.然后我读到了答案中提到的"问题:"部分,它帮助了我.我添加了`header("Access-Control-Allow-Origin:*");`作为第二个最后一个头.当我改变顺序(保留它作为第一个标题)时,它对我有用.另外我只在选项中设置`type:'GET'.保持`dataType:'jsonp'`不会为我返回标题,它只返回响应/数据.这可能有助于其他面临类似问题的人.再次感谢 (2认同)

小智 13

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

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

  • 通过运行具有跨源安全性*的Chrome**``path/to/chrome --disable-web-security`,可以获得较少侵入性(尽管是临时的)解决方案.**警告**:如果您继续使用不受保护的Chrome进行常规浏览,则不会发生任何事情,或者您的银行帐户将被黑客攻击,祝您好运. (2认同)

Mal*_*lio 12

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

  • 为了更充分地解释这一点,使用这样的"原始"数据可以避免CORS更常见的预检.由于没有飞行前,没有访问控制检查,这避免了整个问题.+1 (8认同)