如果你在开发和测试应用程序时不想浪费时间处理跨域问题,你可以使用 Firefox 的插件 Force CORS。
更新:似乎该插件已经不存在了。但是还有另一种选择 - 这个 Chrome 扩展程序。
对于现代浏览器,您可以尝试以下方法:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
简而言之,您需要将以下内容添加到 SERVER
响应头中(以下允许从foo.example
访问):
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER
Access-Control-Max-Age: 1728000
请注意,X-PINGOTHER
是由JavaScript插入的自定义标头,应该因站点而异。
如果您希望任何站点通过Ajax访问您的服务器,请使用*
代替。
编辑:
当我在2009年首次回答这个问题时,我实际上遇到了同样的问题,并且我使用了服务器端配置来解决它。
那时FF或Chrome上没有插件。
但是,现在我们可以使用浏览器端插件的替代方法,请查看tsds
的答案。
withCredentials
选项发送cookie头,则Access-Control-Allow-Origin:*
将无法工作。在这种情况下,您确实需要指定一个特定的域。 - dmkc你尝试使用jQuery的ajax请求了吗?从1.3版本开始,jQuery支持某些类型的跨域ajax请求。
引用上面的参考:
注意:当'dataType'为'script'或'jsonp'时(因为它使用DOM脚本标签加载脚本),所有远程(不在同一域)请求应指定为GET。这些请求不可用于需要XMLHttpRequest对象的Ajax选项。完成和成功函数在完成时调用,但不接收XHR对象;beforeSend和dataFilter函数不会被调用。
从jQuery 1.2开始,如果您指定JSONP回调,可以加载位于另一个域上的JSON数据,可以像这样完成:"myurl?callback=?"。 jQuery会自动替换'?'为正确的方法名来调用您指定的回调函数。或者,如果将'dataType'设置为"jsonp",则会自动添加回调到您的Ajax请求中。
事实上,没有办法“暂时”禁用跨域XMLHttpRequest。如果您可以暂时禁用它,那么它就可以被永久禁用。这是现代AJAX编程中一个相当常见的问题,并且通常使用称为跨域脚本编写技术来解决。
这里的想法是,如果您调用跨域脚本,则返回JavaScript(JSON)结果,然后将其传递给您端上的函数。
以下是一些示例代码,以说明从JavaScript代码角度看它可能是什么样子:
function request_some_data() {
var s = "http://my.document.url.com/my_data?p1=v1&p2=v2&callback=myfunc";
try {
try{
document.write("<scr"+"ipt type='text/javascript' src='"+s+"'></scr"+"ipt>");
}
catch(e){
var x = document.createElement("script");
x.src = s;
document.getElementsByTagName("head")[0].appendChild(x);
}
}
catch (e) {
alert(e.message);
}
}
然后在您的代码中定义一个接收数据的函数,在服务器端“处理”回调情况,以下是客户端JavaScript代码:
function myfunc(data) {
alert(data);
}
在服务器端,这里我举了一个PHP的例子,但是在Java或者其他你使用的服务器端技术中同样容易实现:
<?php
if($_GET["callback"]) {
print($_GET["callback"] . "(");
}
/* place your JSON object code/logic here */
if($_GET["callback"]) {
print(");");
}
?>
允许跨域:
about:config
security.fileuri.strict_origin_policy
现在可以关闭标签页。通常情况下,使用此配置可以进行跨域请求。
有关更多详细信息,请参见此处。
我使用Fiddler作为代理。Fiddler将本地主机调用重定向到外部服务器。
我配置了Firefox使用手动代理(127.0.0.1端口8888)。Fiddler通过使用URL过滤器捕获调用并将其重定向到另一个服务器。