跨域请求的完美解决方法(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 相关文章推荐
用脚本调用样式的几种方法
Dec 09 Javascript
javascript在一段文字中的光标处插入其他文字
Aug 26 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
Oct 16 Javascript
深入分析js的冒泡事件
Dec 05 Javascript
JavaScript定时显示广告代码分享
Mar 02 Javascript
浅析JS异步加载进度条
May 05 Javascript
轻松实现js选项卡切换效果
Sep 24 Javascript
javascript 动态样式添加的简单实现
Oct 11 Javascript
JS动态计算移动端rem的解决方案
Oct 14 Javascript
vue中遇到的坑之变化检测问题(数组相关)
Oct 13 Javascript
JS数组实现分类统计实例代码
Sep 30 Javascript
小程序分享链接onShareAppMessage的具体用法
May 22 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/23 PHP
php流量统计功能的实现代码
2012/09/29 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
配置php.ini实现PHP文件上传功能
2014/11/27 PHP
php从字符串创建函数的方法
2015/03/16 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
DWZ table的原生分页浅谈
2013/03/01 Javascript
js实现表单检测及表单提示的方法
2015/08/14 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
vue实现移动端返回顶部
2020/10/12 Javascript
vue实现下拉菜单树
2020/10/22 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
python在文本开头插入一行的实例
2018/05/02 Python
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
Django rest framework实现分页的示例
2018/05/24 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
在python中实现对list求和及求积
2018/11/14 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
html5 利用canvas实现超级玛丽简单动画
2013/09/06 HTML / CSS
解析浏览器的一些“滚动”行为鉴赏
2019/09/16 HTML / CSS
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
个人安全生产承诺书
2014/05/22 职场文书
法人任命书范本
2014/06/04 职场文书
大学生学习计划书
2014/09/15 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
2015新年寄语大全
2014/12/08 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技