项目地址
为什么浏览器会有同源策略?
避免不同源的网站之间盗取数据
什么是同源?
两个网站的域名,协议,端口三者必须一致才叫同源
不同源的受浏览器哪些限制?
- cookie不能读取
- dom无法获得
- ajax请求不能发送
什么叫跨域?
一个域A的页面去请求另一个域B的资源,这就存在要突破浏览器的限制了 只要两个网站之间的主域名不同,子域名不同,端口不同,协议不同,其中有一项满足,则算跨域
解决跨域问题
JS 自身是不受浏览器限制的本身就是可以跨域的 JS 是用来引用加载为你所用的 不用把它包装打开(读取它的内部) 当然是可以跨域使用的
CORS
response.setHeader('Access-Control-Allow-Origin','http://localhost:8888')
如果你要每个网站都可以跨域的话 把它的referer拿过来都放在ACAO后面这个位置即可 但是不兼容IE
JSONP
JSONP是利用JS语言不受浏览器跨域限制的特性,让JS成为数据的载体,由域B的后端将JSON数据反序列化生成JS对象放在JS文件中进行传输,但所传的数据并不局限于JSON数据。
域A的网站原本想要访问域B的json文件,但是由于跨域了,因此域A需要用js动态创建script标签以访问域B的js文件,域B后端接收到请求之后需要准备一个js文件,将原本要返回的json数据解析成js对象然后重新渲染到js文件中,再把这个js文件返回给网站A。
需要注意的是,由于JSONP缺乏对访客的控制,任何一个网站只要通过script标签的方式去加载js都可以无限制地从你这里获取数据了,因此需要检查对方网站的referer,确认是白名单中的网站才让它跨域.
JSONP的限制是: 只能发get请求,不能发post请求
主要是为了应对兼容IE???
通常我们调用.json文件时的流程是:
前端发起ajax->后台去拿源文件json数据(注意,这完全不是JS对象)扔到前端->前端完成把json数据解析成JS对象的工作
JSONP的逻辑和这个很类似
JSONP只能搭配script 不论你是写死的script标签还是动态JS创建script标签都可以其实
JSONP不能搭配ajax
跨域解决方案
第一种跨域解决方案 CORS
CORS = 网站A的前端发起ajax + 网站B的后端对网站A的域名设置响应头Access-Control-Allow-Origin特许网站A跨域请求
第二种跨域解决方案 JSONP
JSONP= 网站A前端script 加载一个网站B准备好的js文件 + 网站B的后端把json数据填充到一个准备好的js文件并返回给A的前端
- 可以是在网站A的html中写死script标签以加载js
- 也可以是在网站A的js中动态创建script标签以加载js 具体步骤;
- JSONP 缺乏对访客的控制,因为每个网站只要通过script标签的方式去加载js都可以无限制地从你这里获取数据了
- 因此需要检查对方网站的referer,确认是白名单中的网站才让它跨域