将Ajax请求上的Cookie设置为外部域

时间:2016-04-19 09:54:18

标签: javascript jquery iframe cookies cors

我在解决跨域问题时遇到了一些麻烦。特别是我们正在尝试从iframe中的外部域(我们控制)加载内容。为了防止用户每次都在iframe中登录,我们希望在iframe上设置用户cookie。为了做到这一点,我们创建了一个iframe,并对内容进行了ajax调用请求,并使用了一个在请求中设置标头的beforeSend回调。

然而,我们遇到了一些我们无法解决的问题。特别是CORS似乎强加了一个OPTIONS请求,无论如何都要解决这个问题?奇怪的是,如果我们将资源的url直接放入iframe定义中,它不会抱怨OPTIONS请求失败,而是继续正常。只有当我们尝试ajax请求或简单的$ .get(" ...")请求时。

为什么在这种情况下它会允许iframe请求完成而不是ajax调用?

以下是回复标题

Response Headers access-control-allow-credentials:true access-control-allow-headers:* access-control-allow-methods:PUT, DELETE, POST, GET OPTIONS access-control-allow-origin:* access-control-expose-headers:* connection:keep-alive content-length:2474 content-security-policy: content-type:text/html date:Tue, 19 Apr 2016 10:38:07 GMT server:TornadoServer/4.3

1 个答案:

答案 0 :(得分:1)

CORS是出于安全原因:

  

出于安全原因,浏览器会限制跨源HTTP请求   从脚本中启动。例如,XMLHttpRequest如下   同源政策。因此,使用XMLHttpRequest的Web应用程序   只能向自己的域发出HTTP请求。

XMLHttpRequest用于ajax调用,浏览器可能会阻止它。

作为一种解决方法,如果你控制服务器端,你可以添加Access-Control-Allow-Origin标题然后响应,这样浏览器就不会阻止这个ajax调用。

例如,在 PHP (我不知道您使用的服务器技术,请以此为例)您可以(在脚本的顶部):

header('Access-Control-Allow-Origin: *');

或者,如果您只想允许来自您网域的来电:

header('Access-Control-Allow-Origin: http://yourdomain.com');

修改

您应该/也可以使用标题Access-Control-Allow-Methods定义您的CORS调用接受的方法:

header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');