跨域是什么
- 一个网站访问另一个网站的数据
为什么要跨域
- 假如你是2个网站的老板,你想要这2个网站可以互相访问,这时候就需要跨域 有关跨域的关键知识
同源策略
- 浏览器故意设计的一个功能限制
- 不同源的页面之间,不准互相访问数据
CORS
- 突破浏览器限制的一个方法
JSONP
- IE时代的妥协
同源策略
- 什么是同源
- window.origin或location.origin可以得到当前源
- 源=协议+域名+端口号
- 如果协议,域名,端口号完全一致,那么这2个url就是同源的
- 浏览器规定
- 如果JS 运行在 源A里,那么就只能获取源A的数据,不能获取源B的数据,即 不允许跨域
- 这是浏览器的功能,是浏览器故意要这样设计的
- 浏览器这样做的目的是为了保护用户隐私
CORS
问题根源
- 浏览器默认不同源之间不能互相访问数据
- 但是2个不同源的网站都是我的
- 我就是想要2个网站互相访问,浏览器为什么要阻止呢
浏览器提供了CORS
-
如果要共享,需要提前声明
-
在提供数据的网站响应头里写上要请求的网站可以访问
-
具体的语法
response.setHeader("Access-Control-Allow-Origin", "http://请求的网站.com");

CORS就这么简单???
是的,就一句话的事,完美解决了问题(不包括IE)
注意:CORS分为简单请求和复杂请求,具体看文档
JSONP
JSONP和JSON半毛钱关系都没有
- 因为以前都是用JSON来传数据,所以就把这方法称为JSONP了,实际能用很多类型的文件来传数据
碰到的问题
-
如果要兼容IE怎么办
-
上面的功能对IE来说根本用不了(IE 6 7 8 9都是)
-
没有CORS,要怎么跨域
-
聪明的程序员想到可以用JS,网站可以随意引用JS
-
在JS里包含数据传过去不就行了么
步骤
frank.com 访问qq.com
-
qq.com 将数据写到/friends.js
-
frank.com 用script 标签引用/friends.js
-
/friends.js 执行,执行什么呢?
-
frank.com 事先定义好window.xxx 函数
-
/friends.js 执行window.xxx({f rinds: […]})
-
然后frank.com 就通过window.xxx 获取到数据了
-
window.xxx 就是—个回调啊!


改良
window.xxx不需要写死,给个随机数就行
script标签 引用后可删除,否则会越来越多,降低网页速度
可能与上面有点出入
以上内容来自饥人谷