我尝试在本地网络中运行以下jquery代码。
$.ajax({
type: "GET",
url: "http://SomeSite/MyUrl/",
cache: false,
data: { ... },
dataType: "json",
error: function (xhr, status, error) {
...
},
success: function (json) {
...
});
一切正常,直到“SomeSite”是localhost。我的意思是从下载页面的同一台服务器。
但是当'SomeSite'是另一个(不是localhost)网站时,它看起来像请求挂起。不是“错误”,也不是“成功”回调函数。如何使此代码有效?
提前谢谢!
答案 0 :(得分:16)
我有同样的问题。试图从服务器获取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);
}
});
其中proxy.php(来自Ben Alman的文件)托管在您的域中
答案 1 :(得分:7)
您是否有服务器访问'SomeSite',或者它是第三方?
如果您有权限,可以在其上启用CORS
wp,home 。在最简单的形式(数据不是会话敏感),只需添加标题:Access-Control-Allow-Origin: *
如果您无权访问,您是否知道它是否支持JSONP
wp,so ?这通常涉及在URL中传递至少callback
个参数。 (当然,如果您有权限,也可以添加JSONP
支持。)
如果您无权更改“SomeSite”并且既不支持CORS
也不支持JSONP
,则可以使用YQL
wp,home 作为代理。它支持CORS
和JSONP
,甚至可以翻译数据格式,选择部分数据等。
(请注意,YQL尊重robots.txt
,因此如果它是限制自动访问的第三方网站,您可能仍然不幸。)
答案 2 :(得分:2)
我有类似的问题。我尝试了Symba引用的代理脚本,但由于某种原因它无法在我的机器上运行。在我的情况下,我试图向同一主机上的JBoss AS上托管的应用程序发送请求。不知怎的,JBoss的版本没有办法修改响应头,所以我可以包含“Access-Control-Allow-Origin”,“*”。
我通过使用上面的Symba方法解决了这个问题,但我只是在我的Apache服务器上设置反向代理而不是Ben Alman的脚本,请参阅https://www.simplified.guide/apache/configure-reverse-proxy。 默认情况下,Apache仍会存在跨域问题。通过设置响应标题“Access-Control-Allow-Origin”,“*”,请参阅http://enable-cors.org/server_apache.html,问题就消失了。
答案 3 :(得分:1)
您可以尝试jsonp request http://api.jquery.com/jQuery.ajax/查看crossdomain
答案 4 :(得分:1)
请查看cross domain jquery ajax request。如果远程服务器支持JSONP,那么我猜你可以使用回调。
答案 5 :(得分:1)
实际上你只能打电话给GET 没有通过跨站点脚本调用POST,PUT,DELETE或PATCH的故障保护方式 唯一可行的方法是手写代理。
答案 6 :(得分:1)
由于原始政策相同,您无法执行此操作。一种解决方法是使用Flash AJAX jQuery插件http://flxhr.flensed.com/,它使用Flash电影来绕过同源策略。
其他选项是通过您自己的域代理请求或使用JSONP。
答案 7 :(得分:1)
如果您有权访问要从中加载资源/数据的服务器,则可以修改服务器响应的请求标头以包含
“Access-Control-Allow-Origin”,“*”
浏览器强制执行的同源策略 - 据我所知,根据浏览器的不同程度的严格程度 - (部分?)基于响应标头的值。
尝试从Web服务加载json时遇到了同样的问题。我找到的所有JS黑客攻击并没有真正起作用,我想知道为什么我甚至不得不这样做,如果我想从我自己控制(和信任)的服务器加载数据。然后我了解到服务器的响应头在整个问题中起着至关重要的作用。当我将上面提到的标题添加到我的webservice的http响应时,问题就解决了。