跨域请求的完美解决方法(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 相关文章推荐
用js实现的仿sohu博客更换页面风格(简单版)
Mar 22 Javascript
jQuery中.live()方法的用法深入解析
Dec 30 Javascript
21个值得收藏的Javascript技巧
Feb 04 Javascript
js操作css属性实现div层展开关闭效果的方法
May 11 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
Jun 10 Javascript
jquery实现的Banner广告收缩效果代码
Sep 02 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
Jul 12 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
Aug 01 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
Jul 27 Javascript
移动设备手势事件库Touch.js使用详解
Aug 18 Javascript
使用Angular自定义字段校验指令的方法示例
Feb 01 Javascript
使用Ajax实现无刷新上传文件
Apr 12 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
Windows PHP5和Apache的安装与配置
2009/06/08 PHP
利用PHP实现智能文件类型检测的实现代码
2011/08/02 PHP
PHP常用的三种设计模式汇总
2016/08/28 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
2013/12/11 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
浅谈jQuery添加的HTML,JS失效的问题
2016/10/05 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
使用Javascript简单计算器
2018/11/17 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
python实现class对象转换成json/字典的方法
2016/03/11 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
Python 加密与解密小结
2018/12/06 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
美国家用和厨房电器销售网站:Appliances Connection
2020/01/24 全球购物
药学专业毕业生求职信
2013/10/20 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
国际贸易实训总结
2015/08/03 职场文书
大学生社会实践感想
2015/08/11 职场文书
趣味运动会标语口号
2015/12/26 职场文书
大学生创业计划书
2019/06/24 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题
给numpy.array增加维度的超简单方法
2021/06/02 Python
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技