posts - 19,  comments - 128,  trackbacks - 0
    解决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。
 
posted on 2011-07-14 14:59  MySoft  阅读(949)  评论(0编辑  收藏