最近想用node作为后台抛出接口,前端页面去请求接口的时候报错了,发现是跨域的问题。为什么会出现跨域问题呢?我们就需要了解什么是浏览器的同源策略。
什么是浏览器的同源策略,为什么要同源策略
同源策略简单来说就是三同,同协议、同域名、同端口。个域内的脚本仅仅具有本域内的权限,可以理解为本域脚本只能读写本域内的资源,而无法访问其它域的资源。这种安全限制称为同源策略,有同源策略的原因就在于为了提升浏览器的安全性,但是,我们都知道安全性和方便性是成反比的,有了高的安全性必定给我们的操作带来低效,牺牲了Web拓展上的灵活性,现代浏览器在安全性和可用性之间选择了一个平衡点。在遵循同源策略的基础上,选择性地为同源策略“开放了后门”。例如img、script 、style等标签,都允许垮域引用资源,严格说这都是不符合同源要求的。
JavaScript这个安全策略在进行多iframe或多窗口编程、以及Ajax编程时显得尤为重要。根据这个策略,在souhu.com下的页面中包含的JavaScript代码,不能访问在google.com域名下的页面内容;甚至不同的子域名之间的页面也不能通过JavaScript代码互相访问。对于Ajax的影响在于,通过XMLHttpRequest实现的Ajax请求,不能向不同的域提交请求,例如,在you.example.com下的页面,不能向me.example.com提交Ajax请求,等等。
举例说明
URL | 说明 | 是否允许通信 |
---|---|---|
http://www.baidu.com/a.js http://www.baidu.com/b.js |
同一域名 | 允许 |
http://www.baidu.com/map/a.js http://www.baidu.com/tieba/b.js |
同一域名不同文件夹下 | 允许 |
http://www.baidu.com:8000/a.js http://www.baidu.com/b.js |
同一域名不同端口 | 不允许 |
http://www.baidu.com/a.js https://www.baidu.com/b.js |
同一域名不同协议 | 不允许 |
http://www.baidu.com/a.js http://75.32.68.45/b.js |
域名和域名对应ip | 不允许 |
http://www.baidu.com/a.js |