跨域请求的完美解决方法(JSONP, CORS)


Posted in Javascript onJune 12, 2016

一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题。解决方法有JSONP,Flash等等。

JSONP

我们发现,Web页面上调用js文件时不受是否跨域的影响,凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>。那就是说如果要跨域访问数据,就服务端只能把数据放在js格式的文件里。恰巧我们知道JSON可以简洁的描述复杂数据,而且JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据。然后客户端就可以通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件。客户端在对JSON文件调用成功之后,也就获得了自己所需的数据。这就形成了JSONP的基本概念。允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

jQuery支持JSONP的调用。在另外的一个域名中指定好回调函数名称,就可以用下面的形式来就加载JSON数据。

url?callback=?
jQuery.getJSON(url + "&callback=?", function(data) { 
 alert(data.a + data.b); 
});

服务端当然也要提供JSONP的支持,其实只要提供读写callback这个params就可以了。

跨域资源共享(CORS)

Cross-Origin Resource Sharing (CORS) 是W3c工作草案,它定义了在跨域访问资源时浏览器和服务器之间如何通信。CORS背后的基本思想是使用自定义的HTTP头部允许浏览器和服务器相互了解对方,从而决定请求或响应成功与否。

CORS与JSONP相比,更为先进、方便和可靠。

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

2、 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。

3、 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS。

对一个简单的请求,没有自定义头部,要么使用GET,要么使用POST,它的主体是text/plain,请求用一个名叫Orgin的额外的头部发送。Origin头部包含请求页面的头部(协议,域名,端口),这样服务器可以很容易的决定它是否应该提供响应。

服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。

Header set Access-Control-Allow-Origin * 

为了防止XSS攻击我们的服务器, 我们可以限制域,比如

Access-Control-Allow-Origin: https://3water.com

很多服务都已经提供了CORS支持,比如 AWS 支持跨域资源分享功能CORS,向S3上传不需要代理。

以上这篇跨域请求的完美解决方法(JSONP, CORS)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ExtJS PropertyGrid中使用Combobox选择值问题
Jun 13 Javascript
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
Nov 30 Javascript
javascript实现点击提交按钮后显示loading的方法
Jul 03 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
Oct 31 Javascript
在JavaScript中call()与apply()区别
Jan 22 Javascript
详解ECMAScript6入门--Class对象
Apr 27 Javascript
vue通过点击事件读取音频文件的方法
May 30 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
Jul 12 Javascript
JavaScript闭包原理与用法实例分析
Aug 10 Javascript
js事件on动态绑定数据,绑定多个事件的方法
Sep 15 Javascript
bootstrap table实现合并单元格效果
Dec 24 Javascript
JS Math对象与Math方法实例小结
Jul 05 Javascript
浅谈jquery的map()和each()方法
Jun 12 #Javascript
Jquery 自定义事件实现发布/订阅的简单实例
Jun 12 #Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
Jun 12 #Javascript
使用Script元素发送JSONP请求的方法
Jun 12 #Javascript
JavaScript获取IP获取的是IPV6 如何校验
Jun 12 #Javascript
Bootstrap弹出框(modal)垂直居中的问题及解决方案详解
Jun 12 #Javascript
Javascript简写条件语句(推荐)
Jun 12 #Javascript
You might like
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
spl_autoload_register与autoload的区别详解
2013/06/03 PHP
phpQuery让php处理html代码像jQuery一样方便
2015/01/06 PHP
Zend Framework教程之Autoloading用法详解
2016/03/08 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
python实现批量监控网站
2016/09/09 Python
python win32 简单操作方法
2017/05/25 Python
python的mysqldb安装步骤详解
2017/08/14 Python
python实现类之间的方法互相调用
2018/04/29 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
将tensorflow的ckpt模型存储为npy的实例
2018/07/09 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
python gensim使用word2vec词向量处理中文语料的方法
2019/07/05 Python
详解Python文件修改的两种方式
2019/08/22 Python
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
小学生元旦感言
2014/02/26 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
公司承诺书格式
2014/05/21 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
高中学生会竞选演讲稿
2014/08/25 职场文书
工商行政处罚决定书
2015/06/24 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
Python趣味挑战之教你用pygame画进度条
2021/05/31 Python
关于springboot 配置date字段返回时间戳的问题
2021/07/25 Java/Android
Python+tkinter实现高清图片保存
2022/03/13 Python