【reference:http://www.javashuo.com/article/p-aldnmuns-ms.html】html
如今不少人特别是前端开发人员,在ajax请求,XMLHttpRequest的过程当中会碰到一个问题,那就是跨域请求:前端
当咱们javaScript脚本试图跨域访问时,浏览器会告诉你相似于No 'Access-Control-Allow-Origin' header is present on the requested resource.的消息。java
但是我有时候又有跨域请求的强烈需求,好比须要去别的网站抓取一些数据(固然如今有不少方法来支持跨域,但这不是本文要讲的内容)。原来这是浏览器的一个策略----“同源策略”。web
所谓同源策略,它是浏览器的一种最核心最基本的安全策略。它对来自不一样源的文档或这脚本对当前文档的读写操做作了限制。ajax
为何要有这个策略,想必你已经知道,那就是由于保证用户的信息安全。跨域
假设如今有a.com和b.com两个域,若是没有这一安全策略,那么当用户在访问a.com时,a.com的一段脚本就能够在不加载b.com的页面而随意修改或者获取b.com上面的内容。这样将会致使b.com页面的页面发生混乱,甚至信息被获取,包括服务器端发来的session。这样的话,咱们的web世界将是一片混乱。也是由于浏览器的同源策略,保证来至不一样源的对象不会互相干扰,保证了咱们访问页面最基本的安全。浏览器
只有同一域名或者,同一域名不一样文件夹下是容许跨域的,其余的状况都是不容许跨域。安全
访问同源的资源是被浏览器容许的,可是若是访问不一样源的资源,浏览器默认是不容许的。访问不一样源的资源那就是咱们所说的跨域服务器
从表中能够看出域名,子域名,端口号,协议不一样都属于不一样源,当脚本被认为是来至不一样源时,均被浏览器拒绝请求。session
在这里须要注意的是,文档中的全部带“src”属性的标签均可以跨域加载资源,而不受同源策略的限制。
如<script>、<img>、<iframe>、<link>等。若是你在页面定义了这些标签,在页面加载事都对不一样源的资源发起了一次GET请求。可是经过src加载的资源,浏览器限制了脚本对其返回的内容没法读写。特别是在ajax请求的时候,特别要注意XMLHttpRequest的时候是没法跨域访问的。
当咱们b.com在页面加载不一样源的资源时 <script src='a.com/a.js'></script> ,对于页面来讲,a.js是运行在b.com上的,所以对于当前页面来讲,a.js的源(Origin)是b.com而不是a.com。
所以页面内存放的资源的域a.com并不重要,重要的是加载资源的页面所在的域b.com。