=波波日志 > JavaScript/Ajax > 如何解决ajax跨域的问题=
[转]如何解决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。
假设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。
类别:JavaScript/Ajax 作者:转载 日期:2010-01-20 【评论:0 阅读:】
暂时没有评论!
发表留言
同类热门博文
- ·AJAX跨域问题解决办..
- ·ajax+asp.net+mssql..
- ·ajax问题总结
- ·JavaScript解析XML的..
- ·JS URL编码函数
- ·ajax+asp+mssql无刷..
- ·ajax无刷新上传文件..
- ·美化alert,confirm..
博格Tag
- flash/flex/fcs/AIR(750)
- Asp.Net/C#/WCF(476)
- JavaScript/Ajax(232)
- 操作系统及应用软件(206)
- SQL及数据库(105)
- 黑客技术(96)
- Asp/VBScript(85)
- 网站排名及优化(82)
- PHP/apache/Perl(72)
- HTML/WML/CSS兼容(65)
- 其他(59)
- 个人日志(44)
- lucence.net/分词技术(33)
- C#设计模式(22)
- 计算机网络(17)
- 日语学习(15)
- Canvas/VML/SVG(13)
- linux(10)
- 游戏开发(8)
- 正则表达式(5)
- Jsp/Java(4)
最新博文
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载或引用的作品侵犯了您的权利,请通知我们,我们会及时删除!
Powered by showbo,G51人力资讯网,桂ICP备05005887号
Powered by showbo,G51人力资讯网,桂ICP备05005887号
