跨域请求的完美解决方法(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 相关文章推荐
Json字符串转换为JS对象的高效方法实例
May 01 Javascript
JavaScript将一个数组插入到另一个数组的方法
Mar 19 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
Apr 21 Javascript
js实现鼠标点击文本框自动选中内容的方法
Aug 20 Javascript
jQuery采用连缀写法实现的折叠菜单效果
Sep 18 Javascript
bootstrap confirmation按钮提示组件使用详解
Aug 22 Javascript
你应该知道的几类npm依赖包管理详解
Oct 06 Javascript
jQuery实现ajax回调函数带入参数的方法示例
Jun 26 jQuery
VUE实现可随意拖动的弹窗组件
Sep 25 Javascript
在vue中获取token,并将token写进header的方法
Sep 26 Javascript
VueJS 取得 URL 参数值的方法
Jul 19 Javascript
解决vue组件销毁之后计时器继续执行的问题
Jul 21 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产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
php下载远程大文件(获取远程文件大小)的实例
2017/06/17 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
jquery 模板的应用示例
2013/11/12 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
jQuery检测返回值的数据类型
2015/07/13 Javascript
继续学习javascript闭包
2015/12/03 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
python实现复制整个目录的方法
2015/05/12 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
Python实现随机创建电话号码的方法示例
2018/12/07 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
python实现文件批量编码转换及注意事项
2019/10/14 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
兰兰过桥教学反思
2014/02/08 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
全陪导游词
2015/02/04 职场文书
售票员岗位职责
2015/02/15 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS