什么是 JSONP,什么是 CORS,什么是跨域

500 阅读3分钟

同源策略

在讲什么是跨域前,我们来先了解几个概念

同源

  1. 在一个网页中使用window.oringin/location.oringin可以查看当前的源,源=协议+域名+端口号。关于同源就是指三者完全一样,并缺一不可完全相同就可以称为同源的。 浏览器规定为防止数据的泄露。如果js运行在源A里面那么就只能获取源A的数据,不能获取源B的数据,不允许跨域。
  2. 举例假设yang.com/index.html引用了cdn.com/1.js,那么就说1.js运行在源yang.com里。跟cdn.com没有关系,所以1.js只能获取yang.com的数据,不能获取1.yang.com或者qq.com的数据。不同源的页面之间,不准互相访问数据。
  3. 以具体例子说明
  • 建两个目录,qq-com和allen-com分别模拟QQ空间和坏人网站,有两个server.js
  • 然后分别在目录下,建一个public文件夹,qq里面放着index.html/qq.js/friends.json;allen目录下的public里面放着index.html/allen.js.
  • 各自更改server.js的文件路径,保证我们可以正常访问这些文件路径,记住端口号设置不同的
  • 一个小插曲,关于如何设置hosts,找到记事本用管理员权限打开,然后c/windows/systerm32/drivers/etc 勾选所有文件类型,找到hosts,编辑保存并退出。
  • 正常使用AJAX,在qq.com:8888里面运行的js使用AJAX请求json的步骤可以能够得到结果,也可以访问到/friends.json,但是如果使用allen.com:8889里面运行的js是不可能访问到的。

跨域

由于同源策略,那么为了实现不同源之间相互访问数据,有什么办法呢

CORS

使用CORS,浏览器说如果要共享数据,需要提前说明,服务器在响应头里面,使用Access-Control-Allow-Oringin来设置可以访问此数据的源,就可以访问了,如果要允许多个呢,可以使用request.headers['referer'],动态的引用,具体的也可以查看mdn文档。

JSONP

  1. 使用JSONP,主要由于IE10以前的版本根本不支持CORS,但又要跨域,那ie浏览前怎么办呢,只好另想一种办法了。
  • 虽然不可以跨域访问数据,但是js是可以跨域引用的。所以只需要将我们需要跨域访问的数据放在一个js文件的回调函数当作参数,然后用script标签去引用这个js文件,该js文件会执行这个回调函数,该回调函数里面就有我们需要的数据。
  • 这个回调函数的名字为了不冲突,它是一个随机数,我们会使用callback参数的形式传给后端,后端会处理执行函数。
  • 使用此办法的优点是它会兼容ie,可以完成跨域
  • 那么缺点就是使用的是script标签,所以读不到精准的状态码,也不知道具体的响应体内容。不支持post只支持get.
  • 至于JSONP这个名字和JSON有什么关系吗,只能这样说刚开始的时候请求数据时JSON文件,在js里面一个回调函数加上这个JSON文件就像JSON with padding,所以JSOP出现了,但现在请求数据的类型很多,所以JSONP和JSON没什么关系。