浅析跨域

147 阅读2分钟

什么是同源

简单来说,当两个URL的协议、域名、端口号完全一致时,那么两个URL为同源。

来看一下URL的组成部分:

  • http:// --> 协议
  • www --> 子域名
  • hahaha.com --> 主域名
  • 80 --> 端口(http:// 默认端口是80)
  • abc/a.js --> 请求资源路径

什么是跨域

当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同域。跨域的意思是不同域名之间互相请求资源即算作跨域。

CORS 跨域

在同源策略的安全保护下网页之间是不允许跨域的,而CORS则是跨域的方法之一。

CORS方法只用在服务端设置 Access-Control-Allow-Origin就可以开启 CORS。 该属性表示哪些域名可以访问资源,如果设置通配符则表示所有网站都可以访问资源。

CORS分为简单请求与复杂请求,具体可以参考MDN文档:developer.mozilla.org/zh-CN/docs/…

JSONP 跨域

JSONP也是跨域的方式之一,当CORS方法使用不了的时候,比如IE浏览器跨域,我们就可以使用JSONP。

JSONP的原理:

利用 <script> 标签没有跨域限制的漏洞,网页可以得到从其他来源动态产生的 JSON 数据。JSONP请求一定需要对方的服务器做支持才可以。

JSONP的实现:

  • 声明一个回调函数,其函数名(如xxx)当做参数值,要传递给跨域请求数据的服务器,函数形参为要获取目标数据(服务器返回的data)。

  • 创建一个<script>标签,把那个跨域的API数据接口地址,赋值给script的src,还要在这个地址中向服务器传递该函数名。

  • 服务器接收到请求后:把传递进来的函数名和它需要给你的数据拼接成一个字符串。

  • 最后服务器把准备的数据通过HTTP协议返回给客户端,客户端再调用执行之前声明的回调函数(xxx),对返回的数据进行操作。