前端跨域的几种解决方式总结(推荐)


Posted in Javascript onAugust 16, 2017

 搞大前端的,肯定都会遇到跨域问题的,虽然网上这方面的资料也很多,但我还是喜欢自己写一遍,自己理解过、总结过的东西才记得最深刻。

同源策略

JavaScript 的同源策略,是由Netscape提出的一个著名的安全策略,为了阻止A站的JS去操作别的网站的数据。你想啊,你现在打开了浏览器,在一个tab窗口中打开了银行网站,在另外一个tab窗口中打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的JavaScript,当你访问这个恶意网站并且执行它JavaScript时,你的银行页面就会被这个JavaScript修改(比如说获取你的卡号和密码,又或者是转账到黑客的账户上等等),后果会非常严重!而同源策略就为了防止这种事情发生,它规定了A网站下的JS文件只能操作A网站下的数据,不能去操作B网站的数据。

为了方便理解,我们把这个词拆分成同源和策略这2个词吧(原谅我,我就怕你不理解啊)。

所谓同源指的就是指资源是来自同一个源的。如果两个页面拥有相同的协议,端口号,和主机(包括子域名和主域名),那么这两个页面就属于同一个源。

所谓策略指的是可以做什么事情。同一个源下的JS可以操作同一个源下的数据。

举个例子来看看你理解了没有吧,看下面这个链接,协议是http协议,主机是store.company.com,端口号一般默认的都是80了。然后和下面的这个表中的各个URL进行比较,判断一下哪些是同源的,哪些不是同源的。

URL 结果 原因
http://store.company.com/dir2/other.html 同源  
http://store.company.com/dir/inner/another.html 同源  
https://store.company.com/secure.html 非同源 协议不同
http://store.company.com:81/dir/etc.html 非同源 端口不同
http://news.company.com/dir/other.html 非同源 主机不同

什么是跨域

跨域

前端跨域的几种解决方式总结(推荐)

跨域的解决方案

方案1-JSONP

JSONP是JSON with padding的简写。JSONP由两部分组成:回调函数和数据。

回调函数是客户端和服务端约定好一个函数名,一般在请求中指定。

数据是传入回调函数中的JSON数据。

JSONP是通过动态的

callback({"name": "michael"});

问题一:JSONP是需要动态创建script标签的,我们需不需要处理这些script元素?怎么处理?

问题二:JSONP请求的时候,服务器发生错误该怎么办,比如服务器崩掉,比如返回了404页面,前端该怎么处理这个错误,难道直接让它抛出么?

答案

JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求

JSONP的兼容性好,不需要XMLHttpRequest的支持

方案2-跨域资源共享CORS

跨域资源共享定义了在必须访问跨域资源的时,浏览器与服务器应该如何沟通。他的原理是使用自定义的 HTTP 头部,让服务器与浏览器进行沟通,主要是通过设置响应头的 Access-Control-Allow-Origin 来达到目的的。

方案3-document.domain

浏览器的同源策略使得不同域的框架是不能进行JS的交互操作的。比如:有一个页面是http://www.examples.com/a.htmls,在这个页面中还有一个http://examples.com/b.htmls,很显然,a.html与b.html是不同域的,所以我们无法通过在页面中书写js代码来获取iframe中的东西,但是,如果我们把这2个页面的document.domain都设置成相同的域名就可以了,需要注意的是,我们只能把document.domain设置成自身或更高一级的父域,且主域名必须相同。

使用条件

document.domain适用于不同子域的框架之间的交互。

方案4-window.name

window对象有个name属性,该属性有一个特征:即在一个窗口的生命周期内,窗口载入的所有页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的。

方案5-window.postMessage

window.postMessage(message,targetOrigin)方法,可以用来向其他的window对象发送消息,无论这个window对象是属于同一个源还是不同源

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助~如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持!

Javascript 相关文章推荐
通过DOM脚本去设置样式信息
Sep 19 Javascript
一个简单的JavaScript数据缓存系统实现代码
Oct 24 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
Mar 28 Javascript
jQuery实现ichat在线客服插件
Dec 29 Javascript
基于javascript实现根据身份证号码识别性别和年龄
Jan 22 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
May 30 Javascript
JavaScript实现公历转农历功能示例
Feb 13 Javascript
vue之nextTick全面解析
May 17 Javascript
vue使用axios实现文件上传进度的实时更新详解
Dec 20 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
Jan 08 Javascript
JS中判断字符串存在和非空的方法
Sep 12 Javascript
Three.JS实现三维场景
Dec 30 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
Aug 16 #Javascript
详解如何使用webpack+es6开发angular1.x
Aug 16 #Javascript
微信小程序自定义组件
Aug 16 #Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
Aug 16 #Javascript
微信小程序多列选择器range-key使用详解
Mar 30 #Javascript
jQuery取得元素标签名称小结(附代码)
Aug 16 #jQuery
微信小程序tabBar底部导航中文注解api详解
Aug 16 #Javascript
You might like
php之CodeIgniter学习笔记
2013/06/17 PHP
php class类的用法详细总结
2013/10/17 PHP
PHP编程基本语法快速入门手册
2016/01/07 PHP
CCPry JS类库 代码
2009/10/30 Javascript
在模板页面的js使用办法
2010/04/01 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
jquery验证邮箱格式并显示提交按钮
2015/11/07 Javascript
深入理解js generator数据类型
2016/08/16 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
微信小程序实现九宫格抽奖
2020/04/15 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
jquery实现简单拖拽效果
2020/07/20 jQuery
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
python中常用的各种数据库操作模块和连接实例
2014/05/29 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
NumPy统计函数的实现方法
2020/01/21 Python
Python CSS选择器爬取京东网商品信息过程解析
2020/06/01 Python
python编写一个会算账的脚本的示例代码
2020/06/02 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
思想政治自我鉴定
2013/10/06 职场文书
《黄河颂》教学反思
2014/02/07 职场文书
区优秀教师事迹材料
2014/02/10 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
污水处理保证书
2015/05/09 职场文书
运动会入场词
2015/07/18 职场文书
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android