跨域概述
跨域(Cross-Origin Resource Sharing,简称 CORS)是指在浏览器上运行的Web应用程序试图通过XMLHttpRequest或Fetch API等方式向不同源的服务器发送请求时,浏览器会根据同源策略阻止这种行为。
同源策略是一种安全机制,用于限制来自不同源的页面对当前页面的访问。它可以防止恶意的网站通过跨域请求获取用户的个人信息或进行未授权操作。
同源策略
同源策略(Same-Origin Policy,简称SOP)是一种约定,它要求请求的协议、域名(IP)和端口号必须完全相同才被认为是同源。
也就是说只要协议、域名(IP)和端口号,任何一项与当前页面的协议、域名(IP)和端口号不一致,就会被浏览器阻止。我们也把这种请求叫跨域请求。在这种情况下,浏览器会抛出一个跨域错误,导致请求失败。
跨域是浏览器行为。实际上我们发出的请求已经到达服务器了,但是服务器返回数据时被浏览器限制了
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'xxxxxx' is therefore not allowed access
不受同源策略影响
<script src=""></script>
<link href=""></link>
<a href=""></a>
<img src="" />
<iframe src="" />
同源策略概览
URL | 说明 | 是否允许通信 |
---|---|---|
www.a.com/a.js www.a.com/b.js | 同一域名下 | 允许 |
www.a.com/lab/a.js www.a.com/script/b.js | 同一域名下不同文件夹 | 允许 |
www.a.com:8000/a.js www.a.com/b.js | 同一域名,不同端口 | 不允许 |
www.a.com/a.js www.a.com/b.js | 同一域名,不同协议 | 不允许 |
www.a.com/a.js http://70.32.92.74/b.js | 域名和域名对应ip | 不允许 |
script.a.com/b.js script.a.com/b.js | 主域相同,子域不同 | 不允许 |
www.a.com/a.js a.com/b.js | 同一域名,不同二级域名 | 不允许(cookie这种情况下也不允许访问) |
www.cnblogs.com/a.js www.a.com/b.js | 不同域名 | 不允许 |
解决跨域的方案
JSONP
JSONP (JavaScript Object Notation) 是服务器与客户端跨源通信的常用方法。它是用键值对形式来描述一组数据,最大特点就是简单适用,兼容性好,缺点是只支持get请求,不支持post请求。
JSONP核心思想:网页通过添加一个<script>
类似的元素,向服务器请求 JSON 数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来。
方案
<script src="./js/jquery-3.7.1.js"></script>
<script>
$.ajax({
url:"http://www.dlrb.com/kuakua/kuakua.php?callback=getUserList",
dataType:"jsonp",
success:function(resp){
console.log(JSON.parse(resp));
}
})
</script>
<script src="./js/jquery-3.7.1.js"></script>
<script>
let url = "http://www.dlrb.com/kuakua/kuakua.php?callback=?"
$.getJSON(url, function (data) {
console.log(data);
})
</script>