「JS笔记」来聊一聊什么是跨域 V09

143 阅读2分钟

什么是同源

  • window.originlocaltion.origin 可以得到当前的源
  • 源 = 协议 + 域名 + 端口号 如果两个 url 的 协议、 域名、 端口号完全一致,那么这两个 url 就是同源的
    小栗子: https://juejin.cn/www.baidu.com不同源 https://baidu.comhttps://www.baidu.com不同源
    完全一致才算同源

什么是跨域

当你点击 MDN 的时候就发生了跨域,因为不同源

同源策略

说到跨域就要说说同源策略

浏览器规定

  • 如果JS运行在源A里,那么就只能获取源A的数据
  • 不能获取源B的数据,即不允许跨域 目的:为了保护用户隐私 故 同源策略就是不同源的页面之间,不准互相访问数据

JSONP 跨域

注:JSONPJSON 没有任何关系
思路:\

  1. 在需要兼容 ie, 不可以使用CORS 的情况下,该如何跨域呢?
  2. 我们可以随便引用网站的JS(BootCDN)
  3. 虽然我们不可以去访问数据(JSON、MySql、SQL)
  4. 但是我们可以引用JS
  5. 那可不可以让JS里面拿到数据呢?

步骤

  1. 让 hhh.com 访问 qq.com
  2. qq.com 将数据写到 /friends.js
  3. hhh.com 用 script 标签引用 /friends.js
  4. /friends.js执行
  5. hhh.com 事先定义好 window.xxx 函数
  6. /friends.js 执行 window.xxx({fridens: [...]})
  7. 然后 hhh.com 就通过 window.xxx 获取到了数据(window.xxx 不就是回调吗???) 优化一下
    只要 hhh.com 和 qq.com/friends 执行的函数名是同一个即可,那就可以直接把名字给 /friends.js
    再优化
    封装成 jsonp('url').then(f1, f2)

缺点

  • script标签是读取不到响应头(Set-Cookie)的,只能知道成功/失败,并且只能发get请求,不支持post

CORS 跨域

不需要考虑 ie 的话,如果要共享数据需要提前声明,那么就需要在响应头里加要访问的origin
Access-Control-Allow-Origin: origin

Access-Control-Allow-Origin: https://developer.mozilla.org