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


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 相关文章推荐
该如何加载google-analytics(或其他第三方)的JS
May 13 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
Sep 05 Javascript
谷歌地图打不开的解决办法
Aug 07 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
Oct 17 Javascript
JQuery实现防止退格键返回的方法
Feb 12 Javascript
很实用的js选项卡切换效果
Aug 12 Javascript
剖析Angular Component的源码示例
Mar 23 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
Dec 06 jQuery
JS实现的tab页切换效果完整示例
Dec 18 Javascript
vue基础之模板和过滤器用法实例分析
Mar 12 Javascript
JS实现滑动拼图验证功能完整示例
Mar 29 Javascript
javascript中call,apply,bind的区别详解
Dec 11 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图像处理类分享
2014/11/18 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
javascript delete 使用示例代码
2010/03/29 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
js中获取键盘按下键值event.keyCode、event.charCode和event.which的兼容性详解
2017/03/15 Javascript
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
python脚本实现分析dns日志并对受访域名排行
2014/09/18 Python
linux环境下python中MySQLdb模块的安装方法
2017/06/16 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
python对DICOM图像的读取方法详解
2017/07/17 Python
Sanic框架路由用法实例分析
2018/07/16 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
培训专员岗位职责
2014/02/26 职场文书
幼儿园大班毕业教师寄语
2014/04/03 职场文书
大学计划书范文800字
2014/08/14 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
休学证明范本
2015/06/19 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书
浅谈Python中的正则表达式
2021/06/28 Python
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android