跨域 CORS JSONP

210 阅读3分钟

项目地址

CORS与JSONP实现跨域请求的项目

为什么浏览器会有同源策略?

避免不同源的网站之间盗取数据

什么是同源?

两个网站的域名,协议,端口三者必须一致才叫同源

不同源的受浏览器哪些限制?

  • 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,确认是白名单中的网站才让它跨域