跨域请求的完美解决方法(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 遮罩层实现(mask)实现代码
Jan 09 Javascript
js实现星星打分效果的方法
Jul 05 Javascript
JavaScript实现LI列表数据绑定的方法
Aug 04 Javascript
Javascript typeof与instanceof的区别
Oct 18 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
Dec 13 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
Dec 14 Javascript
浅谈JavaScript正则表达式-非捕获性分组
Mar 08 Javascript
在vue项目中安装使用Mint-UI的方法
Dec 27 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
Nov 08 Javascript
vue实现的网易云音乐在线播放和下载功能案例
Feb 18 Javascript
js 实现watch监听数据变化的代码
Oct 13 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
Apr 07 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 函数语法介绍一
2009/06/14 PHP
一个简单的php加密解密函数(动态加密)
2013/06/19 PHP
Thinkphp5.0框架视图view的模板布局用法分析
2019/10/12 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
原生js操作checkbox用document.getElementById实现
2013/10/12 Javascript
JS 获取滚动条高度示例代码
2013/10/24 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
requireJS使用指南
2016/04/27 Javascript
angularjs 源码解析之injector
2016/08/22 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
Windows下Node.js安装及环境配置方法
2017/09/18 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
使用element-ui table expand展开行实现手风琴效果
2019/03/15 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
vue简单练习 桌面时钟的实现代码实例
2019/09/19 Javascript
举例介绍Python中的25个隐藏特性
2015/03/30 Python
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
Python使用剪切板的方法
2017/06/06 Python
你眼中的Python大牛 应该都有这份书单
2017/10/31 Python
python斐波那契数列的计算方法
2018/09/27 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
python控制nao机器人身体动作实例详解
2019/04/29 Python
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
美津浓美国官网:Mizuno美国
2018/08/07 全球购物
shell程序中如何注释
2012/02/17 面试题
如何理解transaction事务的概念
2015/05/27 面试题
工商企业管理应届生求职信
2013/11/03 职场文书
一封普通求职者的求职信
2013/11/20 职场文书
优秀应届生求职信
2014/06/16 职场文书
工作调动申请报告
2015/05/18 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers