同源与跨域

161 阅读3分钟

1.是什么是同源 同源策略,是浏览器故意设置的一个功能,用来限制JS语言的访问。先来说说什么是源: 在当前网页中使用 window.origin 或 location.origin 就能得到当前源。 源就是一个带有 协议 + 域名 + 端口号 信息的字符串。 要想同源,就必须做到三个相同,协议,域名,端口号都要相同,才能保证两个URL是同源的。同源政策的目的是为了保证⽤户信息的安全,防⽌恶意⽹站窃取用户数据。还能防范网站被人进行恶意修改。 2.什么是跨域 不同源的页面发生交互,就叫做跨域。 同源策略控制不同源页面之间发生交互时,受到同源策略的约束如下:

  1. Cookie、LocalStorage 和 IndexDB 存储数据无法读取。
  2. DOM 无法获得。
  3. AJAX 请求不能发送。 如果想要实现不同源页面之间的数据互相访问,就需要用到一些跨域的技术绕过同源策略。 实现跨域AJAX请求的技术有:JSONP和CORS技术等。 3.JSONP跨域 JSONP特点:兼容性好,老旧的浏览器也都支持。但是它只支持 GET 请求,不支持 POST 请求。 原理:利用script标签中src属性可以加载任意文件的特性,通过这个属性来访问数据接口,向服务器请求JSON数据,这种做法不受同源政策限制;而服务器收到请求后,会返回一个由回调函数包裹的json数据,从而达到获取跨域数据的目的。 4.CORS跨源 CORS是跨源资源分享(Cross-Origin Resource Sharing)。它是W3C标准,是跨源AJAX请求推荐的解决方法。 特点:需要浏览器和服务器同时支持。CORS不兼容IE10以下浏览器。相比JSONP只能发 GET 请求,CORS允许任何类型的请求。 整个CORS通信过程,都是浏览器自动完成,不需要用户参与。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。 页面发起的AJAX请求又可分为简单请求和非简单请求,这里为了说明原理只举例简单请求的情况。 浏览器发现一个跨域的简单请求时,会自动在请求头中添加形如Origin: https://xx.com字段,说明本次请求来自哪个源(协议+域名+端口)。 服务器解析请求,如果不支持当前页面的跨域请求,则返回头信息不包含Access-Control-Allow-Origin字段。如果 Origin 指定的域名在许可范围内,服务器返回的响应头会多出几个信息字段。都以Access-Control-开头。 浏览器根据响应头是否包含Access-Control-Allow-Origin字段,判断跨域是否成功。