首页 文章

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

提问于
浏览
2

我在解决跨域问题时遇到了一些麻烦 . 特别是我们正在尝试从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 回答

  • 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');
    

    EDIT

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

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

相关问题