javascript跨域的解决方案

相信做过web前端开发的都曾遇到过跨域问题。何谓之“跨域”?跨域问题就是一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。但为什么要这样做了,主要是为了保证数据的安全,防止一些XSS。以下我就列举一些我实际工作中使用的方案。

JSONP

JSONP (JSON with Padding)是一个简单高效的跨域方式,貌似也有人称其为script tag。HTML中的script标签可以加载并执行其他域的javascript,于是我们可以通过script标记来动态加载其他域的资源。说白了,就是动态请求javascript脚本,将回调方法的调用返回,同时将请求的数据作为该方法的参数一并返回。这样脚本一加载完毕,就执行该方法,数据也就得到了。当然这样做,也是有一定安全隐患的。因为第三方可以随意返回一些可执行的脚本回来,所以第三方必须是受信任的。同时此方案只支持GET,不支持PUT、POST、DELETE,因为它实际上只是请求一个script而已。

Flash Proxy

顾名思义,就是借助flash来作为代理,向其他域请求数据。当然flash也是有自己的一套安全策略的,也是存在着跨域的问题。不过通常来说只要在服务器配置一下crossdomain.xml文件,声明哪些域的flash是可以访问的。你只需在页面嵌入一个小小的flash,来代理处理javascript与后端的交互就ok了。显然这个方案有个弊端就是你得有服务器的权限,允许你配置添加crossdomain文件。

Server Proxy

我个人认为这个是最简单了,而且一般的服务器如(Apache)都支持代理功能,当然你也可以写代码实现一个代理功能。www.a.com的前端javascript将本来访问www.b.com/api/user/1的请求,改为访问www.a.com/api/user/1,而服务器将www.a.com/api/user/1改为指向www.b.com/api/user/1,这样前端就可以获取b.com的数据了。因为全端一直访问的都是a.com的资源,所以也就不存在跨域的问题。

上面三种方案各有各的好处,而一般来说我个人比较推荐Server Proxy这种。因为他对环境的依赖算是比较低的,而且前端不需编写太多的额外代码。

当然还有其他的方法,具体请参考:http://sd.csdn.net/a/20110127/290968.html

posted @ 2011-09-25 17:49  rongtou  阅读(231)  评论(0)    收藏  举报