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