jQuery - 如何删除跨域限制

Tom*_*Tom 12 jquery json cross-domain

我正在开发一个适用于移动设备的Web应用程序,而jsonp对于跨域请求非常酷,但服务器的API不支持回调参数.所以我只能使用json从远程服务器获取数据.

我在jQuery中尝试了json,似乎它不支持跨域请求.我在safari上尝试了原始的ajax请求函数,它在跨域工作得很好,所以我可以在jQuery中删除json请求的跨域限制吗?(不是jsonp,只有json),以及如何做到这一点?

或者是否有任何替代简单的a​​jax库(跨Web浏览器)并且可以在跨域请求上执行json.

And*_*nez 33

同源政策

您试图绕过同源政策.它内置于每个浏览器中,通常不是您可以或应该要禁用/解决方法/等等.这是您的站点,用户和用户浏览器之间非常重要的安全合同.

CORS(可能)

CORS允许您的Web服务器告诉浏览器/客户端允许访问另一个域.这是通过Web服务器输出以下HTTP标头来完成的

 Access-Control-Allow-Origin: http://www.example.com
Run Code Online (Sandbox Code Playgroud)

如果您无法控制HTTP标头,则无法使用CORS.这方面的实现是特定于语言/框架的.

请注意,您应该检查以确保浏览器兼容性,因为IE8/9的支持有限.还要注意这是一个潜在的攻击媒介.如果您不负责任地使用响应数据,它允许第三方站点的响应执行XSS攻击.

JSONP(可能)

JSONP是一种通过动态添加script带有src等于"yoururl.com?<your parameter data>"页面的属性的标记来 在服务器之间传递和获取数据的聪明方法.如果没有Web代理(见下文)或applet(Flash/Java),这是完成此类专长的唯一合法方式.但是,如果您不是请求两端的提供者,它确实有自己的安全风险.请记住,JSONP允许远程服务器在您的上下文中执行代码,您应该非常小心谁给予了这些权力.

"香草"AJAX(不可能)

如果您没有使用JSONP来获取数据,那么您很可能尝试使用AJAX请求来获取数据.AJAX请求也受同源策略的约束.JavaScript库(例如jQuery,Prototype,Dojo等)无法绕过此策略作为Ajax请求的基本行为.但是,他们可以支持JSONP(现在记住,不是AJAX).

带Web代理的AJAX(可能)

如果您确实想要从其他服务器请求数据,则可以转发您的请求.您的主站点的服务器将充当代理.您需要向自己的服务器发出一个AJAX请求,然后服务器端代码将向另一个域发出请求,然后通过AJAX调用响应将响应发送到您的脚本.

这是一个常见的模式,它在这里详细描述为Web代理模式这里的pricture友好雅虎(但记住它是雅虎特定的,只是采取一般的想法).但是,它依赖于服务器端语言.整体实现将是相同的,但是这样做的代码将根据您选择的服务器端语言(PHP,Ruby,Python,C等)而有所不同.有些语言已经有了库/模块/等来支持这种模式.

Flash(可能,非默认)

处于默认状态的Flash不支持跨域请求.它可以在Flash7 +中使用跨域策略文件打开,但强烈建议不要使用.您的脚本必须与Flash API接口,它将发出请求并将数据返回给您的JavaScript.

Java Applet(可能,非默认)

Java也受到相同的原始策略的约束,但是在其发布时,它与Flash有类似的工作.

各种其他"黑客"

还有其他黑客,但它们通常要求您控制两端或具有商定的通信标准.例如'window.name'黑客.我不建议大多数这些方法.

其他方案

已经提出了与此类似的另一个问题.它概述了我没有涉及的其他几种方法:规避同源策略的方法

最佳解决方案

  1. CORS - 如果你相信第三方
  2. Web代理 - 如果不这样做

您自己域中的Web代理可以让您清理正在检索的数据,它可以为您的用户提供最大程度的保护.但是,如果您进行零卫生,则不会比此处列出的任何方法更安全.如果您确实实现了某种类型的Web代理,请确保其请求仅限于您希望的站点.否则,您将基本上创建一个开放代理,如果被发现可能会被用户滥用并使您陷入法律麻烦.


Cla*_*diu 6

我遇到过同样的问题.试图从服务器获取json我没有访问权限(=>没有JSONP).

我发现http://benalman.com/projects/php-simple-proxy/将php代理添加到您的服务器并对此文件执行ajax调用."要传递给远程URL资源的任何GET参数都必须在此参数中进行urlencoded."

$.ajax({
   type: 'GET',
   url:'proxy.php?url=http://anyDomain.com?someid=thispage',
   dataType: "json",
   success: function(data){
      // success_fn(data);
   },
   error: function(jqXHR, textStatus, errorThrown) {
      // error_fn(jqXHR, textStatus, errorThrown);
   }
});
Run Code Online (Sandbox Code Playgroud)

其中proxy.php(来自Ben Alman的文件)托管在您的域中


替代方案(我发现它是第二好的):http: //james.padolsey.com/javascript/cross-domain-requests-with-jquery/