方式:
一 是通过Flash插件发送HTTP请求,这种方式可以绕过浏览器的安全限制,但必须安装Flash,并且跟Flash交互。不过Flash用起来麻烦,而且现在用得也越来越少了。
二 是通过在同源域名下架设一个代理服务器来转发,JavaScript负责把请求发送到代理服务器:
'/proxy?url=http://www.sina.com.cn'
代理服务器再把结果返回,这样就遵守了浏览器的同源策略。这种方式麻烦之处在于需要服务器端额外做开发。
三 JSONP,它有个限制,只能用GET请求,并且要求返回JavaScript。这种方式跨域实际上是利用了浏览器允许跨域引用JavaScript资源:
<script src="http://example.com/abc.js"></script>
JSONP通常以函数调用的形式返回,例如,返回JavaScript内容如下:foo('data');
如果在页面中先准备好foo()
函数,然后给页面动态加一个<script>
节点,相当于动态读取外域的JavaScript资源,最后就等着接收回调了。
<html> <head> <meta charset='utf-8' /> </head> <script> // refreshPrice 对应就好 function refreshPrice(data){ var p=document.getElementById("test-jsonp"); p.innerHTML="当前价格:"+ data['0000001'].name+':'+data['0000001'].price } function getPrice(){ var price=document.createElement('script'); var head=document.getElementsByTagName("head")[0]; price.src= 'http://api.money.126.net/data/feed/0000001,1399001?callback=refreshPrice'; head.appendChild(price); } </script> <body> <p id="test-jsonp">here</p> <button type='button' οnclick='getPrice()'>refresh</button> </body> </html>
四 CORS
浏览器支持HTML5,那么就可以一劳永逸地使用新的跨域策略:CORS了。
CORS全称Cross-Origin Resource Sharing,是HTML5规范定义的如何跨域访问资源。
假设本域是my.com
,外域是sina.com
,只要响应头Access-Control-Allow-Origin
为http://my.com
,或者是*
,本次请求就可以成功。
可见,跨域能否成功,取决于对方服务器是否愿意给你设置一个正确的Access-Control-Allow-Origin
,决定权始终在对方手中。