【问题标题】:Who can exclude Same origin policy?谁可以排除同源政策?
【发布时间】:2013-06-18 16:52:48
【问题描述】:

Code。为什么

$.ajax({
    type : "get",
    url : "http://www.facebook.com",        
    success: function(data){
           console.log(data);
     }
});

工作和

$.ajax({
    type : "get",
    url : "http://www.google.com",        
    success: function(data){
           console.log(data);
     }
});

在浏览器控制台抛出著名的XMLHttpRequest cannot load同源策略异常!

为什么?我想这取决于浏览器?

【问题讨论】:

  • 你的小提琴不起作用——它只是不会产生错误。
  • 对facebook的请求没有到达成功回调,也没有得到响应。该请求似乎在到达相同的来源错误之前已被取消。

标签: jquery ajax same-origin-policy


【解决方案1】:

由服务器(facebook、google 等)决定是否允许跨域加载其内容。这称为跨域资源共享。要在您的服务器上启用 CORS,请在您的响应中提供此标头:Access-Control-Allow-Origin: *。

您无法更改不属于您的服务器的行为。

【讨论】:

  • 好吧,但是允许所有域作为来源 ('*') 是个坏主意,这会完全禁用 SOP。
  • 是什么让你把它称为一个明显的坏主意?在使用不记名令牌的 API 调用等情况下,这是一个合理的设置。即使对于那些支持基于 cookie 的身份验证的应用程序,仅具有此设置对我来说似乎也不是一个坏主意。你有一个场景吗? @Tali
【解决方案2】:

http://www.facebook.com 发送一个301 Moved Permanently 响应,该响应重定向到https://www.facebook.com。

似乎重定向导致请求失败比彻底的跨域失败更安静。但是,这两个请求确实都失败了。

编辑

根据W3C Ajax specification:

如果响应的 HTTP 状态代码为 301、302、303、307 或 308 ...

  1. 将请求 URL 设置为 Location 标头传达的 URL。
  2. 如果源源和请求 URL 的源是同源,则透明地遵循重定向,同时遵守同源请求事件规则。
  3. 否则,请按照跨域请求步骤并终止此算法的步骤。

文本“透明地跟随重定向”表示 Ajax 应该将 301 重定向的目标视为原始目标。但是,在执行重定向时,会根据新的目标源重新检查同源策略。

目标域还必须与请求脚本具有相同的来源,或者它必须使用允许请求来源访问的 CORS 标头进行响应。

【讨论】:

  • jQuery 不遵循 ajax 调用中的任何重定向(至少不是我最后一次检查的地方)。如果浏览器支持 CORS,则可能只有在最终 url 不允许访问时才会违反跨域策略。 (但我需要检查规格,以确保这一点)
  • 您能否更具体地谈谈“更安静地失败”?
  • @t.niese Ajax 重定向完全有效;查看我的编辑并引用 W3C 规范。
猜你喜欢
  • 2011-08-17
  • 1970-01-01
  • 2015-03-01
  • 2012-11-14
  • 2015-08-19
  • 2015-08-25
  • 2010-12-17
相关资源
最近更新 更多