关于浏览器跨域访问

 解决浏览器的跨域问题,不要想完全通过在浏览器中使用脚本绕过浏览器的相同来源策略,那是做不到的,除非你所使用的浏览器版本刚好存在严重的bug,否则做浏览器的那帮人都不必混了。

解决跨域问题,要从浏览器之外想办法,据我所知有两种方法:

方法1:在服务器端实现一个服务器端的代理,接收跨域的请求,通过HTTP得到请求的数据后转发给客户端的浏览器。
但是你在客户端也要做一些事情,因为XMLHttpRequest对象默认情况下是不接受发到其他域的URL的。方法是使用Decorator模式给XMLHttpRequest加上一层封装,将发到其他域的URL改写为发给服务器端代理的URL。

《Ajax模式与最佳实践》最后一章:“基于REST的MVC模式”给出了一种非常详细的解决方案,这种方案也是属于方法1的。

方法2:在客户端实现一个客户端的HTTP代理,配置浏览器使用这个HTTP代理。通过HTTP代理请求跨域的数据(通过一个绑定在本域的特殊的 URL,例如:/selenium-server/RemoteRunner.html?sessionId=260113)这是在Selenium RC中所使用的方式。他们为了绕过浏览器的相同来源策略,以便可以对于任意的Web网站执行客户端的自动测试,使用了一个Java实现的客户端的HTTP 代理。
详情请看Selenium RC的文档:
http://www.openqa.org/selenium-rc/tutorial.html
在方法2中,同样要使用Decorator模式给XMLHttpRequest加上一层封装,将发到其他域的URL改写为能够触发客户端代理相应操作的URL。

有人会争论说,通过动态加载脚本(就是动态创建<script>元素)的方式可以实现跨域,那不是真正的跨域,因为数据的交互是单向的。那样你最多只能调用其他域的功能,你取回的数据还是无法与本域的数据(HTML DOM树)进行交互。

很抱歉我没有提供现成可用的代码,我其实不是很喜欢有些同学什么都等别人给一个现成的答案的态度。

 

一些参考方法:

http://stuff.rancidbacon.com/gmaps-standalone/

http://johnvey.com/features/deliciousdirector/web-service-broker.html

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值