记得一两年前,Ajax开始被炒得火热的时候 ,那时也是我刚刚学习Javascript,就曾经听说过XMLHttpRequest在默认浏览器限制下是不能跨域访问的。而由于过的太久了,我一时给忘记了,更由于自己经常写js自娱自乐,在本地文件打开就没有“跨域”这个概念了。所以之前还跟人家在论坛上争吵这个议题。
其实如果真的没有那个限制的话,可能一切都乱了套了,那随便的静态网站都动态化了。不管是基于安全还是基于版权,我都觉得这个浏览器策略是正确的。
然而,凡事都有例外的,怎么让“可信任的网站”访问我的网页源代码呢?
你知道“百度知道”可以嵌入在自己的网页里是什么原因吗?
很简单,是因为那是js脚本嵌入~~~而且是直接用document.write~因为html是直接“写”在你的文档里~所以所获取的“数据”是完全可以由你的代码控制的。
可能讲到这里有人觉得,这有什么,关键是别人的网页都不是“百度知道”,难道为了js的跨域我就要专门设立一个“输出管道”不成?
其实想想,有何不可?
其实只要一个简单的步骤就可以实现客户端代码的跨域访问了:
在“被访问”的数据源网站的网站程序设置一个“代理”就行了,简单来讲就是通过服务器代码检测http请求是否来自“被信任的网站”,然后以一种不同的方式返回“html文本”。
举例来讲就是:a.com和b.com网站
a.com的脚本想要访问b.com的任意一个页面,通过xmlHttpRequest做不到,可以用
<script type="text/javascript" src="http://b.com/any"></script>,脚本动态实现。。。
如果是一般人访问http://b.com/any的话返回的文件是:
< head >
< title >
Any Title
</ title >
</ head >
< body >
Any Content
</ body >
</ html >
而由a.com页面下发起的请求则返回以下文本:
这样复杂吗?如果原文件没有换行或者引号的话确实很简单..(.=.=怎么可能没有)所以还要做必要的字符串转换,比如把换行符换成文本型的/n等等……反正就是要做到html文件以js代码的身份潜入到客户端,供客户端代码差遣。
总的来说,这是一个无聊的解决方案。