浅谈跨域

297 阅读2分钟

跨域关键知识点:

  • 同源策略
  • CORS—突破浏览器限制的一个方法
  • JSONP—IE时代的妥协

同源定义

源:

  • 源=协议+域名+端口
  • window.origin或location.origin可以得到当前的源

如果两个URL的协议,域名和端口号完全一致,那么这两个URL同源。

举例:

baidu.com和https://www.baidu.…

完全一致才同源

同源策略定义

浏览器规定:如果js运行在源A里,那么只能获取A的数据,不能获取源B的数据,即不允许跨域

  • 举例

假设frank.com/index.html引用了cdn.com/1.js那么就说1.js运行在源frank.com里,所以1.js只能获取frank.com的数据不能获取qq.com的数据。这是浏览器的功能,出于保护隐私。

跨域

什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源。

有时候我们需要实现跨域来完成我们想要的数据共享,最常用的两种方法是:跨域资源共享CORSJSONP

COPS跨域

CORS (Cross-Origin Resource Sharing,跨域资源共享)是一个系统,它由一系列传输的HTTP头组成,这些HTTP头决定浏览器是否阻止前端 JavaScript 代码获取跨域请求的响应。

举个栗子:如果frank.com:9999运行的js想访问qq.com:8888里面的js访问的/friends.json,正常的AJAX是不能访问的,但是我们用CROS可以做到:

我们可以在qq.com的响应头里写frank.com可以访问即可:

response.setHeader("Access-Control-Allow-Origin", "frank.com:9999")

JSONP跨域

因为IE不支持CORS,为了兼容IE,所以才有了JSONP,JSONP的思路是:既然我们无法访问qq.com:8888/friends.json,但是我们可以引用qq.com:8888/friends.js啊,只需要让js包含数据内容即可。

步骤:

qq.com把数据写到/friends.js

frank.com用script标签引用/friends.js

/friends.js执行在frank.com事先定义好的window.XXX函数

/friends.js执行函数然后frank.com 就通过window.xxx获取数据

window.xxx就是一个回调

代码详见:github.com/leehome150/…