如何解决ajax跨域的问题

解决ajax跨域的问题 ajax跨域调用的解决办法有很多种,我这里只说两种:

假设s.cnblogs.com是一个评论系统,只提供javascript方式的调用。news.cnblogs.com是一个新闻系统,这个系统将评论功能委托给s.cnblogs.com。这时news.cnblogs.com发表评论的代码可能是:
function sendData(data,callback)
{
var xmlHttp=createXmlHttpRequest();
xmlHttp.open('post','http://s.cnblogs.com/postHandler.ashx');
xmlHttp.onreadystatechange=callback;
xmlHttp.send(data);//data包含要发送的数据。
}
这代代码在IE6中会有一个安全提醒,但在IE7里面,直接会出错。因为跨域。
第一种解决方案:document.domain.
1.将sendData代码存进一个services.htm文件中。并在services.htm中设置document.domain='cnblogs.com'
2.将services.htm放到s.cnblogs.com网站根目录下面。
3.在news.cnblogs.com提交评论的页面加上<iframe id='ajaxFrame' src='http://s.cnblogs.com/services.htm' width='0' height='0'></iframe>
4.在news.cnblogs.com提交评论的页面加上
function sendData(data,callback)
{
    ajaxFrame.window.sendData(data,callback);
}
和document.domain='cnblogs.com';
方案的缺点:
只能解决跨子域的问题。

方案2:动态script 法。
1.在news.cnblogs.com提交评论的页面加上,<script id='ajaxProxy' src=''></script>
function sendData(data,callback)
{
    var proxy=document.getElementById('ajaxProxy');
    proxy.src='http://s.cnblogs.com/postHandler.ashx?data="+data;
    proxy.onreadystatechange=callback;
}
我个人更喜欢方案2,但方案的一个问题是callback可以做的事情太少,无法接收postHandler.ashx发回的所馈数据。
不过,我觉得有一种变通的方案,那就是直接在postHandler.ashx中输出js,比如alert('ok');,但我测试了几次都没能成功能。感觉可能是我的RP问题。

这都不是完美的解决方案,用本地代理才是终极方案!

Ajax跨域访问的问题
出于安全性考虑,浏览器禁止ajax跨域访问,但当有遇到这一类需求时就直接否则ajax直接访问这一方法。
当然方法一定是有的,在网上一搜能找到一堆解决方案,如动态创建iframe获取结果在传回处理的,或者用script的src属性绕过的,还有通过本地代理的,我感觉本地代理方式是一种比较完美的方法,直接通过ajax像本地服务请求,本地服务再向远程服务获取结果,然后传回客户端,当然多了中间一层代理,但过程还是ajax方式的,同时本地的 service可以任意处理出想要的结果。

上回说到使用jQuery跨域调用JSON数据,但是如果对方不提供JSON数据,则需要用另外的方法实现跨域调用。这两天遇到这个问题,查了些资料,有一种基于代理的方式实现跨域调用。
基本解决思路是,在本域写一个程序向对方发起请求,并且将响应内容再输出。这个程序相当于一个代理,则跨域调用就可以变成对本域的调用了。
我用php实现的代理程序如下:
1
2
$remoteURL=urlencode($url);
echo get_file_contents($remoteURL);
要注意的是,使用urlencode需要在php.ini中开启allow_url_fopen。

加支付宝好友偷能量挖...


评论(0)网络
阅读(178)喜欢(0)JavaScript/Ajax开发技巧