跨域域ajax POST在chrome中

有关跨域AJAX问题的几个主题。 我一直在看这些,结论似乎是这样的:

除了使用像JSONP或代理sollution这样的东西之外,你不应该对另一个域做一个基本的jquery $ .post()

我的测试代码看起来像这样(在“ http://myTestdomain.tld/path/file.html ”上运行)

var myData = {datum1 : "datum", datum2: "datum"} $.post("http://External-Ip:port", myData,function(return){alert(return);}); 

当我尝试这个(我开始寻找的原因)时,chrome-console告诉我:

XMLHttpRequest无法加载http:// External-IP:port / page.php 。 Access-Control-Allow-Origin不允许使用Origin http://myTestdomain.tld 。

现在,据我所知,这是预期的。 我不应该这样做。 问题是POST实际上已经到了低谷。 我有一个简单的脚本运行,将$_POST保存到一个文件,很明显post得到了低谷。 我返回的任何实际数据都没有传递给我的调用脚本,由于访问控制问题,这似乎再次出现。 但是post实际到达服务器的事实让我感到困惑。

  • 我认为上面运行在“myTestdomain”上的代码不能对另一个域(外部IP)执行简单的$.post()是否正确?
  • 是否预期请求实际上会到达external-ip的脚本,即使没有收到输出? 或者这是一个错误。 (我使用的是Chrome 11.0.696.60)

我之前在WebKit bugtracker上发布了一张关于此的票,因为我认为这是奇怪的行为,可能存在安全风险。

由于与安全相关的门票不可公开查看,我将引用Justin Schuh的回复:

这完全按照规范的要求实现。 对于简单的跨源请求http://www.w3.org/TR/cors/#simple-method>,没有飞行前检查; 如果相应的标头未授权请求源,则发出请求并且无法读取响应。 从function上讲,这与创建表单和使用脚本进行非原始POST(这一直是可能的)没有什么不同。

所以:你被允许进行POST,因为无论如何你可以通过嵌入表单并用javascript触发提交按钮来完成,但是你看不到结果。 因为您无法在表单场景中执行此操作。

解决方案是向目标服务器上运行的脚本添加标头,例如

  

没有测试过,但根据规范,这应该工作。

Firefox 3.6似乎以不同的方式处理它,首先执行OPTIONS以查看它是否可以执行实际的POST。 Firefox 4做了与Chrome相同的事情,或者至少它在我的快速实验中做了。 有关这方面的更多信息,请访问https://developer.mozilla.org/en/http_access_control

有关JavaScript 同源策略限制的重要注意事项是,它是现代浏览器中为安全性而构建的内容 – 它不是技术的限制或服务器强制执行的操作。

要回答你的问题,这些都不是错误。

  • 请求不会停止到达服务器 – 这使服务器可以通过设置适当的标头1来允许这些跨域请求。

  • 浏览器也会收到响应。 在使用访问控制头1之前 ,对跨域请求的响应将被安全意识的浏览器停在其轨道上 – 浏览器将收到响应,但不会将其移交给脚本。 使用访问控制标头,服务器可以选择设置适当的标头,向兼容的浏览器表明它希望允许某些源URL进行跨域请求。

    浏览器响应的确切行为可能因浏览器而异 – 我现在无法回想起但我认为Chrome在使用jQuery的ajax()时会调用success回调函数,但响应为空。 IIRC,Firefox不会调用success函数。

我得到同样的事情发生在我身上。 您可以跨域发布但无法收到回复。 这是我期望能够在Firefox,Chrome和IE中为我做的事情。

解决这个问题的一种方法是使用本地php文件,通过curl调用数据并响应你的javascript响应。 (重述了你说过你已经知道的事情。)

  1. 是的,这是正确的,除非你使用任何代理,否则你将无法做到这一点。

  2. 不,一旦有此限制,请求将不会转到外部IP。