我正在为移动设备开发Web应用程序,并且jsonp对于跨域请求非常酷,但是服务器的API不支持回调参数。所以我只能使用json从远程服务器获取数据。
我在jQuery中尝试了json,似乎它不支持跨域请求。我在野生动物园上尝试了原始ajax请求功能,并且在跨域上很好用,所以我可以在jQuery中删除json请求的跨域限制吗?(不是jsonp,只有json),该怎么做?
还是有其他替代性的简单ajax库(跨网络浏览器),并且可以对跨域请求执行json。
同源政策
您正试图规避“
同源政策”。它内置于每个浏览器中,通常不是您可以或不应该禁用/解决/其他的东西。这是您的站点,用户和用户浏览器之间非常重要的安全合同。
CORS(可能)
CORS允许您的Web服务器告知浏览器/客户端允许访问另一个域。这是通过Web服务器输出以下HTTP标头来完成的
Access-Control-Allow-Origin: http://www.example.com
如果无法控制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代理模式和此处的对价格友好的Yahoo 模式(但请记住,它是特定于Yahoo的,仅需大致理解即可)。但是,它取决于服务器端语言。总体实现是相同的,但是执行此操作的代码将根据您选择的服务器端语言(PHP,Ruby,Python,C等)而有所不同。某些语言已经具有支持这种模式的库/模块/等。
Flash(可能,非默认)
处于默认状态的Flash不支持跨域请求。可以使用跨域策略文件在Flash7
+中将其打开,但强烈建议您不要使用。您的脚本必须与带有Flash API的接口连接,这将发出请求并将数据返回到JavaScript。
Java Applet(可能,非默认)
Java也受相同的原始策略的约束,但是与Flash
的发行版中所述的工作类似。
其他各种“骇客”
那里还有其他黑客,但是它们通常需要您控制两端或具有商定的通信标准。例如“ window.name”黑客。我不建议大多数这些方法。
其他解决方案
有人问过类似的另一个问题。它概述了我没有介绍的其他一些方法:规避同源政策的方法
最好的解决方案
您自己域上的Web代理可以允许您清理正在检索的数据,它为用户提供了最大的保护。但是,如果您执行零环境卫生措施,那么它不会比这里概述的任何方法更加安全。如果您确实实现某种形式的Web代理,请确保其请求仅限于您想要的站点或来自您希望访问的站点。否则,您实际上将创建一个开放代理,如果发现该代理,用户可能会滥用该代理,从而使您陷入法律麻烦。
问题内容: 这是两个页面,test.php和testserver.php。 test.php testserver.php 现在我的问题是:当这两个文件都在同一服务器上(本地主机或Web服务器)时,它可以工作并被调用;如果它在不同的服务器上,则意味着Web服务器上的testserver.php和localhost上的test.php,它不起作用,并且正在执行。即使ajax内的URL更改为http:
问题内容: 我有此轮询脚本来检查是否在服务器上创建了文本文件。在本地运行良好,但在文件位于其他域时失败。我将如何重写此代码以获得跨域支持? 编辑:我最终使用YQL解决了跨域问题,尽管它可以工作,但是YQL确实很慢,这会增加相当多的性能开销。 谁能为跨域JQuery调用提出更好的解决方案? 问题答案: 在$ .ajax()调用中将dataType设置为“ JSONP” 。您必须确保响应的格式正确才能
问题内容: 这是两个页面,test.php和testserver.php。 test.php testserver.php 现在我的问题是:当这两个文件都在同一服务器上(本地主机或Web服务器)时,它可以工作并被调用;如果它在不同的服务器上,则意味着Web服务器上的testserver.php和localhost上的test.php,它不起作用,并且正在执行。即使ajax内的URL更改为http:
问题内容: 我看到了一些使用Ajax进行跨域的示例,但是它不起作用。 我尝试使用chrome并给出以下错误: 问题答案: 您无法使用,因为它会进行ajax调用,该调用将是跨源的,因此被Same Origin Policy 阻止,并且您尝试访问的Twitter API不支持跨源资源共享(或者如果它支持,允许,它不允许原点或,这是我尝试过的)。 该API确实支持JSONP(这不是真正的Ajax调用),
问题内容: 对于一个项目,我需要获取其他不同域的网页的源代码。我尝试了以下代码: 我仍然没有得到任何结果,只是一个空白的警告框。 问题答案: 默认情况下,所有浏览器都限制跨域请求,您可以使用YQL作为代理来解决此问题。在此处查看指南:http://ajaxian.com/archives/using-yql-as-a- proxy-for-cross-domain-ajax
问题内容: 我正在尝试访问另一个域中的Web服务,但它不返回任何内容。后来我发现这是一个跨域访问的问题。 我在网上搜索了很多文章,但像我这样的新手都看不懂。:( 有人可以帮助我如何访问Web服务吗? 以下是我的代码。 问题答案: 浏览器不允许跨域AJAX调用。仅允许跨域JSONP请求。 要使用JSONP请求,您必须将属性更改为。但是,这意味着您不能请求XML,而只能请求JSONP。 关于JSONP