跨域请求的完美解决方法(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实现页面打印的三种方法
Mar 05 Javascript
获取HTML DOM节点元素的方法的总结
Aug 21 Javascript
对字符串进行HTML编码和解码的JavaScript函数
Feb 01 Javascript
js改变img标签的src属性在IE下没反应的解决方法
Jul 23 Javascript
extjs_02_grid显示本地数据、显示跨域数据
Jun 23 Javascript
js中自定义方法实现停留几秒sleep
Jul 11 Javascript
15个常用的jquery代码片段
Dec 19 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
Apr 11 Javascript
浅谈JavaScript的内置对象和浏览器对象
Jun 03 Javascript
详解JS中的快速排序与冒泡
Jan 10 Javascript
Vue.js学习教程之列表渲染详解
May 17 Javascript
JavaScript函数柯里化实现原理及过程
Dec 02 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
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
php简单封装了一些常用JS操作
2007/02/25 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
PHPMailer发送邮件
2016/12/28 PHP
tp5.1 框架查询表达式用法详解
2020/05/25 PHP
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
javascript 函数调用的对象和方法
2010/07/01 Javascript
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
使用mini-define实现前端代码的模块化管理
2014/12/25 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
Pytorch 实现权重初始化
2019/12/31 Python
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
毕业生自我鉴定
2013/12/04 职场文书
法学个人求职信范文
2014/01/27 职场文书
股权转让意向书
2014/04/01 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
计算机实训报告总结
2014/11/05 职场文书
2014个人年度工作总结
2014/12/15 职场文书
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python
十大好看的穿越动漫排名:《瑞克和莫蒂》第一,国漫《有药》在榜
2022/03/18 日漫
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python