![](http://farm1.static.flickr.com/159/409596029_e8108f5879_s.jpg)
最近想写一个基于AJAX的应用,不过和以往不一样的是,我想直接请求一个外部网站地址(比如某Blog的RSS地址),用外部网站的返回来做这个AJAX应用。于是,我开始动手了,在本地写了一个简单的页面,直接使用的jQuery的AJAX请求。在Firefox里面打开页面,没反映,到是Firefox的console报错了,从没见过的奇怪错误。Google一下,才知道这是因为我调用了跨域的XMLHttpRequest,这是不被允许的。Faint!
Cross Domain AJAX主要就是A.com网站的页面发出一个XMLHttpRequest,这个Request的url是B.com,这样的请求是被禁止的。关于 Cross Domain AJAX的安全问题现在还在被大家讨论着。不过就目前的情况来看,一定要靠一些非常规手段来解决这个问题了。当前比较流行的解决方法主要有下面几种:
-
跨域代理(Cross Domain Proxy)。主要原理就是用php或者其他语言写一个代理请求的转发过程。客户端请求自己的服务器,服务器把请求转发到目标地址并且得到回应,服务器再 把结果返回给客户端。这个过程,对于开发者来说还是不错的选择,因为你可以在服务器上对回应的结果做自己的处理,可以决定需不需把结果要返回给客户端。
-
JSON+动态添加脚本标签(JSON+Dynamic Script Tag)。实现的主要原理是,远端服务器返回的不是XML格式的数据,而是JSON格式的数据。而客户端发出请求的过程,其实是在页面动态的增加一个诸如 <script src="”请求地址”" type="text/javascript"></script> 标签,这个过程会把请求到的那个js文件跑一边,利用这点特性,我们动态的得到了数据。 (JSON and the Dynamic Script Tag: Easy, XML-less Web Services for JavaScript)
-
使用Flash来跨域请求。 有人想出在本地增加一个Flash文件,靠Flash文件来请求跨域的资源。具体方法可以看( Cross-domain AJAX using Flash 与 Flash to the Rescue)。我尝试了一下,不过发现这种方式的请求需要远端服务器上有一个crossdomain.xml文件,这个文件用来描述可访问本资源的网站。
第一种方法只要在发起请求端有所改变就能实现跨域,而后两种都需要同时在发起请求端和回复请求端做点事情才能实现。第一种方式比较简单,对于已有的 系统改动不大。但是,第二中方式却是现在的发展趋势,不可小视。不过在我目前的状况(只能纯写HTML+JS,没有其他权限)下,看上去对跨域是无能为力 了……