跨域请求的完美解决方法(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 相关文章推荐
javascript中的location用法简单介绍
Mar 07 Javascript
JavaScript获取按钮所在form表单id的方法
Apr 02 Javascript
node.js 使用ejs模板引擎时后缀换成.html
Apr 22 Javascript
js实现的简单图片浮动效果完整实例
May 10 Javascript
功能强大的Bootstrap使用手册(一)
Aug 02 Javascript
整理关于Bootstrap列表组的慕课笔记
Mar 29 Javascript
JS实现闭包中的沙箱模式示例
Sep 07 Javascript
React如何将组件渲染到指定DOM节点详解
Sep 08 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
Oct 31 Javascript
Vue瀑布流插件的使用示例
Sep 19 Javascript
react配置antd按需加载的使用
Feb 11 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
Apr 20 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
B/S模式项目中常用的javascript汇总
2013/12/17 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
js单词形式的运算符
2014/05/06 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
Python基于property实现类的特性操作示例
2018/06/15 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
用Python批量把文件复制到另一个文件夹的实现方法
2019/08/16 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
如何通过python实现IOU计算代码实例
2020/11/02 Python
药学专业大学生个人的自我评价
2013/11/04 职场文书
客服文员岗位职责
2013/11/29 职场文书
毕业生找工作的求职信范文
2013/12/24 职场文书
写求职信有哪些注意事项
2014/05/08 职场文书
白血病募捐倡议书
2014/05/14 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
毕业实习计划书
2015/01/16 职场文书
初中英语教学反思范文
2016/02/15 职场文书
OpenCV-Python实现油画效果的实例
2021/06/08 Python
react中的DOM操作实现
2021/06/30 Javascript
java项目构建Gradle的使用教程
2022/03/24 Java/Android