这里是修真院前端小课堂,每篇分享文从javascript
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】html
八个方面深度解析前端知识/技能,本篇分享的是:前端
【前端垮域问题有哪些经常使用的解决方式?? 】java
你们好,我是IT修真院西安分院第5期的学员许恒倩,一枚正直纯洁善良的web程序员,今天给你们分享一下,修真院官网js任务五,深度思考中的知识点——前端垮域问题有哪些经常使用的解决方式??程序员
1.背景介绍:web
1.1 什么是跨域?ajax
指的是浏览器不能执行其余网站的脚本。它是由浏览器的同源策略形成的,是浏览器对javascript施加的安全限制。 json
1.2 为何须要跨域?跨域
受浏览器同源策略的限制,本域的js不能操做其余域的页面对象(好比DOM)。但在安全限制的同时也给注入iframe或是ajax应用上带来了很多麻烦。因此咱们要经过一些方法使本域的js可以操做其余域的页面对象或者使其余域的js能操做本域的页面对象(iframe之间)。浏览器
2.知识剖析
1.同源策略:
它是由Netscape提出的一个著名的安全策略。同源是指,域名,协议,端口相同。浏览器执行javascript脚本时,会检查这个脚本属于那个页面,若是不是同源页面,就不会被执行。
2.为何script标签引入的文件不受同源策略的限制?
由于script标签引入的文件内容是不可以被客户端的js获取到的,不会影响到被引用文件的安全,因此不必使script标签引入的文件遵循浏览器的同源策略。而经过ajax加载的文件内容是可以被客户端js获取到的,因此ajax必须遵循同源策略,不然被引入文件的内容会泄漏或者存在其余风险。
3.静态HTTP服务器:Nginx是一个HTTP服务器,能够将服务器上的静态文件(如HTML、图片)经过HTTP协议展示给客户端
4.反向代理服务器:客户端原本能够直接经过HTTP协议访问某网站应用服务器,网站管理员能够在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,而后将结果返回给客户端,此时Nginx就是反向代理服务器。
5.负载均衡:当网站访问量很是大,一台服务器已经不够用了。因而将同一个应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。Nginx能够经过反向代理来实现负载均衡。
3.常见问题
前端垮域问题有哪些经常使用的解决方式?
4.解决方案
4.1 window.name + iframe
window.name的美妙之处:name值在不一样的页面(甚至不一样域名)加载后依旧存在,而且能够支持很是长的name值(2MB)。原理:利用了“在同一浏览器窗口载入的不一样页面( 不管它们是否不一样域 ),共享同一个window.name,而且都对window.name有读写的权限”的这一特性来实现页面间的数据交换
4.2 CORS
CORS背后的思想,就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,仍是应该失败。CORS须要浏览器和服务器同时支持。目前,全部浏览器都支持该功能,IE浏览器不能低于IE10。整个CORS通讯过程,都是浏览器自动完成,不须要用户参与。对于开发者来讲,CORS通讯与同源的AJAX通讯没有差异,代码彻底同样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感受。 所以,实现CORS通讯的关键是服务器。只要服务器实现了CORS接口,就能够跨源通讯。
4.3 JSONP
JSONP包含两部分:回调函数和数据。回调函数是当响应到来时要放在当前页面被调用的函数。数据就是传入回调函数中的json数据,也就是回调函数的参数了。
jsonp虽然很简单,可是有以下缺点:
1)安全问题(请求代码中可能存在安全隐患);
2)要肯定jsonp请求是否失败并不容易。
4.4 配置Nginx经过域名访问网页
5.编码实战
<body>
<input type="text" id="ipt">
<ul id='ul'>
<li></li>
</ul>
</body>
</html>
<script type="text/javascript">
$('#ipt').blur(function () {
// console.log(1)
// 提供jsonp服务的url地址(不论是什么类型的地址,最终生成的返回值都是一段javascript代码)百度搜索接口
var url = "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?cb=search&wd=" + $('#ipt').val();
// 建立script标签,设置其属性
var script = document.createElement('script');
script.setAttribute('src', url);
// // 把script标签加入head,此时调用开始
document.getElementsByTagName('head')[0].appendChild(script);
})
// 定义回调函数
function search(data) {
console.log(data);
for(var i =0;i<data.s.length;i++){
$('#ul').append( <li>${data.s[i]}</li>
)
}
};
</script>
6.扩展思考
还有什么其余的跨域的方法?
location.hash + iframe
原理是利用location.hash来进行传值。假设域名a.com下的文件cs1.html要和cnblogs.com域名下的cs2.html传递信息。
1)cs1.html首先自动建立一个隐藏的iframe,iframe的src指向cnblogs.com域名下的cs2.html页面;
2)cs2.html响应请求后再将经过修改cs1.html的hash值来传递数据;
3)同时在cs1.html上加一个定时器,隔一段时间来判断location.hash的值有没有变化,一旦有变化则获取hash值
7.参考文献
参考:
前端解决跨域问题的8种方案(最新最全)
深刻理解前端跨域方法和原理
8.更多讨论
9.结束语: