同源策略和跨域
同源
如果两个页面的协议(https或http)、域名和端口都相同,则两个页面是同源
例如对于:https://www.yuque.com/dashboard
URL | 是否同源 | 原因 |
---|---|---|
http://www.yuque.com/dashboard | 否 | 协议不同(https和http) |
https://www.yuque.com/ | 是 | 域名、协议、端口相同 |
https://blog.yuque.com/dashboard | 否 | 域名不同(www和blog不一样) |
https://www.yuque.com:7001/dashboard | 否 | 端口不同(默认为80和7001不一样) |
https://www.yuque.com:80/dashboard | 是 | 端口、协议、域名相同 |
同源策略
同源策略(英文全称 Same origin policy)是浏览器提供的一个安全功能**MDN**
官方给定的概念:同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这
是一个用于隔离潜在恶意文件的重要安全机制
通俗的理解:浏览器规定,A 网站的 JavaScript,不允许和非同源的网站 C 之间,进行资源的交互,例如:
- 无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB
- 无法接触非同源网页的 DOM
- 无法向非同源地址发送 Ajax 请求
如何实现跨域请求
**JSONP**
:出现的早,兼容性好(兼容低版本IE)。是前端程序员为了解决跨域问题,被迫想出来的一种临时解决方案。缺点是只支持GET
请求,不支持POST
请求。**CORS**
:出现的较晚,它是W3C
标准,属于跨域Ajax
请求的根本解决方案。支持GET
和POST
请求。缺点是不兼容某些低版本的浏览器
JSONP实现原理
- 由于浏览器同源策略的限制,网页中无法通过 Ajax 请求非同源的接口数据。但是
<script>
标签不受浏览器同 - 源策略的影响,可以通过
src
属性,请求非同源的js
脚本。 - 因此,
JSONP
的实现原理,就是通过<script>
标签的src
属性,请求跨域的数据接口,并通过函数调用的形式,接收跨域接口响应回来的数据
实现一个简单的JSONP
<script>
function success(data) {
console.log('获取到了data数据:')
console.log(data)
}
</script>
通过 <script>
标签,请求接口数据:
<script src="http://ajax.frontend.itheima.net:3006/api/jsonp?callback=success&name=zs&a
ge=20"></script>