跨域请求的完美解决方法(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 相关文章推荐
JQuery Easyui Tree的oncheck事件实现代码
May 28 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
Nov 30 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
Feb 16 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
Oct 08 Javascript
javascript简单实现类似QQ头像弹出效果的方法
Aug 03 Javascript
Javascript之图片的延迟加载的实例详解
Jul 24 Javascript
详解Vue打包优化之code spliting
Apr 09 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
Mar 21 Javascript
详解vue项目中调用百度地图API使用方法
Apr 25 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
Jul 28 Javascript
Node.js 中判断一个文件是否存在
Aug 24 Javascript
js实现随机圆与矩形功能
Oct 29 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 年龄计算函数(精确到天)
2012/06/07 PHP
php截取字符串函数分享
2015/02/02 PHP
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
作为PHP程序员你要知道的另外一种日志
2018/07/30 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
jQuery.each使用详解
2015/07/07 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
javascript基本算法汇总
2016/03/09 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
JS实现点击掉落特效
2021/01/29 Javascript
python出现&quot;IndentationError: unexpected indent&quot;错误解决办法
2017/10/15 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
Python实现的微信好友数据分析功能示例
2018/06/21 Python
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
Python基本socket通信控制操作示例
2019/01/30 Python
如何查看python关键字
2021/01/17 Python
澳大利亚拥有最佳跳伞降落点和最好服务的跳伞项目运营商:Skydive Australia
2018/03/05 全球购物
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
三年级小学生评语
2014/04/22 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
离婚协议书范本及离婚须知
2014/10/15 职场文书
手术室消毒隔离制度
2015/08/05 职场文书
《秋天的图画》教学反思
2016/02/19 职场文书