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


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 相关文章推荐
Javascript表格翻页效果实现思路及代码
Aug 23 Javascript
详细分析使用AngularJS编程中提交表单的方式
Jun 19 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
Jul 18 Javascript
jQuery+PHP+MySQL实现无限级联下拉框效果
Feb 19 Javascript
IE8兼容Jquery.validate.js的问题
Dec 01 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
Jan 03 Javascript
JS组件系列之JS组件封装过程详解
Apr 28 Javascript
vue项目中的webpack-dev-sever配置方法
Dec 14 Javascript
vue-cli3.0使用及部分配置详解
Aug 29 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
Nov 10 Javascript
小程序实现按下录音松开识别语音
Nov 22 Javascript
vue2.0实现列表数据增加和删除
Jun 17 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高级OOP技术演示
2009/08/27 PHP
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
解析PHP的session过期设置
2013/06/29 PHP
使用ob系列函数实现PHP网站页面静态化
2014/08/13 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
JQuery扩展插件Validate 2通过参数设置验证规则
2011/09/05 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
vue better scroll 无法滚动的解决方法
2018/06/07 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
python读写文件操作示例程序
2013/12/02 Python
Python Socket编程详细介绍
2017/03/23 Python
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
Python Flask基础教程示例代码
2018/02/07 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
详解Python打包分发工具setuptools
2019/08/05 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
python爬虫工具例举说明
2020/11/30 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
2021/01/27 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
英国家用电器购物网站:Hughes
2018/02/23 全球购物
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
如何将字串String转换成整数int
2015/02/21 面试题
《李广射虎》教学反思
2014/04/27 职场文书
大学军训的体会
2014/11/08 职场文书
2014年打非治违工作总结
2014/11/13 职场文书