同源策略
同源指的是域名(或IP),协议,端口都相同,不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况下,不能读写对方的资源。
同源的判定:
以http://www.example.com/dir/page.html为例,以下表格指出了不同形式的链接是否与其同源:(原因里未申明不同的属性即说明其与例子里的原链接对应的属性相同)
链接 | 结果 | 原因 |
http:// www.example.com /dir/page2.html | 是 | 同协议同域名同端口 |
http:// www.example.com /dir2/other.html | 是 | 同协议同域名同端口 |
是 | 同协议同域名同端口 | |
http://www.example.com: 81/dir/other.html | 否 | 端口不同 |
否 | 协议不同端口不同 | |
http:// en.example.com/dir/other.html | 否 | 域名不同 |
http:// example.com/dir/other.html | 否 | 域名不同(要求精确匹配) |
http:// v2.www.example.com/dir/other.html | 否 | 域名不同(要求精确匹配) |
http://www.example.com: 80/dir/other.html | 不确定 | 取决于浏览器的实现方式 |
跨域方法
主流方法:CORS、JSONP、服务器中转
CORS
只要服务器实现了CROS接口就可以跨源通信
浏览器发现这次请求是一次跨域请求,就会在Header里加一个Origin字段
服务器同意后就会在response里增加返回三个Access字段,如果不同意就返回
一个正常的HTTP报文,这种错误无法识别,因为状态码可能是200.
JSONP
只支持GET请求
jsonp就是利用了拥有src这个属性的标签,例如<script>标签都有跨域能力。
在url里加上callback参数,告诉服务器将参数传入这个回调函数中。服务端就是凭借字符串就好了。
参考文章:
https://zhuanlan.zhihu.com/p/259202879?utm_source=qq&utm_medium=social&utm_oi=673208464701001728
http://www.ruanyifeng.com/blog/2016/04/cors.html
https://blog.youkuaiyun.com/hansexploration/article/details/80314948