跨域的2种常用方法-CORS,JSONP

264 阅读2分钟

跨域是什么

  • 一个网站访问另一个网站的数据

为什么要跨域

  • 假如你是2个网站的老板,你想要这2个网站可以互相访问,这时候就需要跨域 有关跨域的关键知识

同源策略

  • 浏览器故意设计的一个功能限制
  • 不同源的页面之间,不准互相访问数据

CORS

  • 突破浏览器限制的一个方法

JSONP

  • IE时代的妥协

同源策略

  • 什么是同源
  1. window.origin或location.origin可以得到当前源
  2. 源=协议+域名+端口号
  3. 如果协议域名端口号完全一致,那么这2个url就是同源
  • 浏览器规定
  1. 如果JS 运行在 源A里,那么就只能获取源A的数据,不能获取源B的数据,即 不允许跨域
  2. 这是浏览器的功能,是浏览器故意要这样设计的
  3. 浏览器这样做的目的是为了保护用户隐私

CORS

问题根源

  1. 浏览器默认不同源之间不能互相访问数据
  2. 但是2个不同源的网站都是我的
  3. 我就是想要2个网站互相访问,浏览器为什么要阻止呢

浏览器提供了CORS

  • 如果要共享,需要提前声明

  • 在提供数据的网站响应头里写上要请求的网站可以访问

  • 具体的语法

 response.setHeader("Access-Control-Allow-Origin", "http://请求的网站.com");

更多的用法请去看MDN文档

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标签 引用后可删除,否则会越来越多,降低网页速度

github代码内容

可能与上面有点出入

以上内容来自饥人谷