跨域关键知识点:
- 同源策略
- CORS—突破浏览器限制的一个方法
- JSONP—IE时代的妥协
同源定义
源:
- 源=协议+域名+端口
- window.origin或location.origin可以得到当前的源
如果两个URL的协议,域名和端口号完全一致,那么这两个URL同源。
举例:
完全一致才同源
同源策略定义
浏览器规定:如果js运行在源A里,那么只能获取A的数据,不能获取源B的数据,即不允许跨域
- 举例
假设frank.com/index.html引用了cdn.com/1.js那么就说1.js运行在源frank.com里,所以1.js只能获取frank.com的数据不能获取qq.com的数据。这是浏览器的功能,出于保护隐私。
跨域
什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源。
有时候我们需要实现跨域来完成我们想要的数据共享,最常用的两种方法是:跨域资源共享CORS和JSONP。
COPS跨域
CORS (Cross-Origin Resource Sharing,跨域资源共享)是一个系统,它由一系列传输的HTTP头组成,这些HTTP头决定浏览器是否阻止前端 JavaScript 代码获取跨域请求的响应。
举个栗子:如果frank.com:9999运行的js想访问qq.com:8888里面的js访问的/friends.json,正常的AJAX是不能访问的,但是我们用CROS可以做到:
我们可以在qq.com的响应头里写frank.com可以访问即可:
response.setHeader("Access-Control-Allow-Origin", "frank.com:9999")
JSONP跨域
因为IE不支持CORS,为了兼容IE,所以才有了JSONP,JSONP的思路是:既然我们无法访问qq.com:8888/friends.json,但是我们可以引用qq.com:8888/friends.js啊,只需要让js包含数据内容即可。
步骤:
qq.com把数据写到/friends.js
frank.com用script标签引用/friends.js
/friends.js执行在frank.com事先定义好的window.XXX函数
/friends.js执行函数然后frank.com 就通过window.xxx获取数据
window.xxx就是一个回调