## 浏览器同源策略 ### 同源条件 协议相同,域名相同,端口相同 ### 非同源下的行为限制 - Cookie、LocalStorage 和 IndexDB 无法读取。 - DOM 无法获得。 - AJAX 请求不能发送。 由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源, ## 解决方法 ### JSONP: 原理是:动态插入script标签,通过script标签引入一个js文件,这个js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入。 ```js function addScriptTag(src) { var script = document.createElement('script'); script.setAttribute("type","text/javascript"); script.src = src; document.body.appendChild(script); } window.onload = function () { addScriptTag('http://example.com/ip?callback=foo'); } function foo(data) { console.log('Your public IP address is: ' + data.ip); }; ``` 优点是兼容性好,简单易用,支持浏览器与服务器双向通信。缺点是只支持GET请求。 ### CORS 服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。 ### websocket ### 通过修改document.domain来跨子域 将子域和主域的document.domain设为同一个主域.前提条件:这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用document.domain进行跨域 主域相同的使用document.domain ### 使用window.name来进行跨域 window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的 ### 使用HTML5中新引进的window.postMessage方法来跨域传送数据 ### flash ### 在服务器上设置代理页面等跨域方式 * * * * * ##### 参考链接 [浏览器同源政策及其规避方法](http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html) [跨域资源共享 CORS 详解](http://www.ruanyifeng.com/blog/2016/04/cors.html)