首发于 终端研发部
解决跨域问题的8种方案(最新最全)

解决跨域问题的8种方案(最新最全)

什么是跨域:

浏览器对于javascript的同源策略的限制,例如 a.cn下面的js不能调用 b.cn中的js,对象或数据(因为 a.cnb.cn是不同域),所以跨域就出现了.

同域:简单的解释就是域名相同,端口相同,协议相同

为什么需要跨域?

在最一开始,我们知道了,跨域只存在于浏览器端。而浏览器为 web 提供访问入口。我们在可以浏览器内打开很多页面。正是这样的开放形态,所以我们需要对他有所限制。就比如林子大了,什么鸟都有,我们需要有一个统一的规范来进行约定才能保障这个安全性。

列举的方法挺多的,在面试的时候,只有回答1-2个就可以了,可以看看前面的简单版的答案。

1.同源策略如下:

2. 前端解决跨域问题

一、 document.domain + iframe (只有在主域相同的时候才能使用该方法)

1) 在 a.com/a.html中:

2、在 script.a.com/b.html中:

二、 动态创建script

这个没什么好说的,因为script标签不受同源策略的限制。

三、 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值

注:由于两个页面不在同一个域下IE、Chrome不允许修改parent.location.hash的值,所以要借助于 a.com域名下的一个代理iframe

代码如下:

先是 a.com下的文件cs1.html文件:

cnblogs.com域名下的cs2.html:

a.com下的域名cs3.html

四: window.name + iframe

window.name 的美妙之处:name 值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)。

1) 创建 a.com/cs1.html

2) 创建 a.com/proxy.html,并加入如下代码

3 在 b.com/cs1.html中包含:

五: postMessage(HTML5中的XMLHttpRequest Level 2中的API)

1) a.com/index.html中的代码:

2) b.com/index.html中的代码:


六:CORS【这个我也不知道哈】

CORS背后的思想,就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败。

IE中对CORS的实现是xdr

其它浏览器中的实现就在xhr中

实现跨浏览器的CORS


七:JSONP

JSONP包含两部分:回调函数和数据。

回调函数是当响应到来时要放在当前页面被调用的函数。

数据就是传入回调函数中的json数据,也就是回调函数的参数了。

jsonp虽然很简单,但是有如下缺点:

1)安全问题(请求代码中可能存在安全隐患)

2)要确定jsonp请求是否失败并不容易

八: web sockets

web sockets是一种浏览器的API,它的目标是在一个单独的持久连接上提供全双工、双向通信。(同源策略对web sockets不适用)

web sockets原理:在JS创建了web socket之后,会有一个HTTP请求发送到浏览器以发起连接。取得服务器响应后,建立的连接会使用HTTP升级从HTTP协议交换为web sockt协议。

只有在支持web socket协议的服务器上才能正常工作。

参考于:
作者:PheonixHkbxoic
链接: cnblogs.com/PheonixHkbx

总结

跨域问题在目前后端分离的架构中普遍存在,本文所介绍的这几种方案虽然都能够解决跨域问题,但其实各有优劣。比如Jsonp方式实现起来较为简单,但只支持GET请求方式,在原生JavaScript脚本中使用方便,但是当利用了如Vue.js这种MVVM框架时就有些难以施展了。反向代理的方式无需改动后端代码,但是对于整个系统而言可移植性较差,CORS方式需要后端来积极配合前端实现跨域。总之,没有技术银弹,我们要在实际情形中比较分析,选择最合适的方案。

代做工资流水公司江门转账流水制作铜陵银行流水PS图片莆田打消费贷流水泉州工资代付流水费用铜陵工资代付流水兰州银行流水电子版代做洛阳银行流水账单费用赣州薪资流水宁波代开入职工资流水太原入职流水模板莆田打银行对公流水黄冈办银行流水账单天津工资流水单公司唐山打工资代付流水新乡银行流水账价格邯郸房贷银行流水 价格昆明工资流水代开株洲签证流水报价咸阳签证工资流水价格哈尔滨签证银行流水 多少钱厦门贷款流水价格绵阳车贷工资流水 图片无锡制作公司流水长沙签证流水制作许昌收入证明公司邯郸签证工资流水费用三亚查车贷工资流水济宁企业对公流水多少钱九江银行流水单办理常州打印工资流水香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化