浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法


Posted in Javascript onFebruary 06, 2017

由于同源策略的缘故,ajax不能向不同域的网站发出请求。

比如a站localhost需要向b站请求数据,地址为:http://www.walk-sing.com/api.php

请求的代码如下:

<html> 
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> 
<script type="text/javascript"> 
 $.get("http://www.walk-sing.com/api.php", function(data){ 
   alert("Data Loaded: " + data); 
  }); 
</script> 
<body> 
</body> 
</html>

访问该页面,页面空白,按F12打开控制台,可以看到截图所示信息:

浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法

解决方案1:jsonp

我们先来看这样一个例子:

<html> 
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> 
<script type="text/javascript"> 
 function alertSomething(data){ 
  alert(data.name+data.age); 
 } 
 alertSomething( 
   {"name":"ben","age":24} 
   ); 
// $.get("http://www.walk-sing.com/api.php", function(data){ 
//  alert("Data Loaded: " + data); 
//  }); 
</script> 
<body> 
</body> 
</html>

执行结果:

浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法

我们也可以这样写:

<html> 
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> 
<script type="text/javascript"> 
 function alertSomething(data){ 
  alert(data.name+data.age); 
 }; 
// $.get("http://www.walk-sing.com/api.php", function(data){ 
// alert("Data Loaded: " + data); 
// }); 
</script> 
<script type="text/javascript" src="alertsomething.js"></script> 
<body> 
</body> 
</html>

alertsomething.js的内容如下:

alertSomething( 
   {"name":"ben","age":24} 
   );

也可以得到截图所示结果。

我们再换一个方式,将alertsomething.js上传到服务器,将代码改为如下形式:

<html> 
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> 
<script type="text/javascript"> 
 function alertSomething(data){ 
  alert(data.name+data.age); 
 }; 
// $.get("http://www.walk-sing.com/api.php", function(data){ 
// alert("Data Loaded: " + data); 
// }); 
</script> 
<script type="text/javascript" src="http://www.walk-sing.com/alertsomething.js"></script> 
<body> 
</body> 
</html>

也可以得到截图所示结果。

不知道大家发现没有,script标签没有同源策略的限制,jsonp正是基于此原理实现的。

jsonp的具体实现可参见如下代码:

jsonp.php

<?php 
$method = isset($_GET['callback']) ? $_GET['callback'] : ''; 
if(!isset($method)){ 
 exit('bad request'); 
} 
$testArr = array( 
 'name' => 'ben', 
 'age' => 23 
); 
echo $method.'('.json_encode($testArr).')';

js代码:

<html> 
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> 
<script type="text/javascript"> 
 function alertSomething(data){ 
  alert(data.name+data.age); 
 }; 
// $.get("http://www.walk-sing.com/api.php", function(data){ 
// alert("Data Loaded: " + data); 
// }); 
</script> 
<script type="text/javascript" src="http://www.walk-sing.com/jsonp.php?callback=alertSomething"></script> 
<body> 
</body> 
</html>

也可以得到截图所示结果。

解决方案二:CORS(跨域资源共享,Cross-Origin Resource Sharing)

不知道大家发现了没有,jsonp只能发送get请求,而如果业务中需要用到post请求时,jsonp就无能为力了。

这时候cors(跨域资源共享,Cross-Origin Resource Sharing)就派上用处了。

CORS的原理:

CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。
就拿前面第一个例子来说,我只要在api.php文件头加上如下一句话即可:

header('access-control-allow-origin:*');

再次请求该接口,结果如下截图所示:

浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法

以上所述是小编给大家介绍的jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
Mar 09 Javascript
js substr、substring和slice使用说明小记
Sep 15 Javascript
js this函数调用无需再次抓获id,name或标签名
Mar 03 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
Dec 12 Javascript
javascript中clipboardData对象用法详解
May 13 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
Aug 31 Javascript
JavaScript模拟push
Mar 06 Javascript
jQuery设置Easyui校验规则(推荐)
Nov 21 Javascript
基于JavaScript实现图片剪切效果
Mar 07 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
Oct 21 Javascript
如何基于原生javaScript生成带图片的二维码
Nov 21 Javascript
json_decode 索引为数字时自动排序问题解决方法
Mar 28 Javascript
canvas实现图像布局填充功能
Feb 06 #Javascript
canvas实现图像截取功能
Feb 06 #Javascript
JS跨域请求外部服务器的资源
Feb 06 #Javascript
canvas实现动态小球重叠效果
Feb 06 #Javascript
canvas滤镜效果实现代码
Feb 06 #Javascript
canvas实现图像放大镜
Feb 06 #Javascript
jquery精度计算代码 jquery指定精确小数位
Feb 06 #Javascript
You might like
PHP调用MySQL存储过程并返回值的方法
2014/12/26 PHP
laravel 数据验证规则详解
2019/10/23 PHP
JQuery 网站换肤功能实现代码
2009/11/02 Javascript
JQuery的一些小应用收集
2010/03/27 Javascript
基于Jquery的开发个代阴影的对话框效果代码
2011/07/28 Javascript
重写javascript中window.confirm的行为
2012/10/21 Javascript
JS实现时间格式化的方式汇总
2013/10/16 Javascript
javascript里使用php代码实例
2014/12/13 Javascript
jquery validate demo 基础
2015/10/29 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
2016/01/19 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
介绍Python中的fabs()方法的使用
2015/05/14 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
PyQt QListWidget修改列表项item的行高方法
2019/06/20 Python
用python打印菱形的实操方法和代码
2019/06/25 Python
python多进程并发demo实例解析
2019/12/13 Python
如何通过python检查文件是否被占用
2020/12/18 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
PHP开发工程师面试问题集锦
2012/11/01 面试题
2014年迎新年联欢会活动策划方案
2014/02/26 职场文书
合作协议书怎么写
2014/04/18 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
小学生校园广播稿
2014/09/28 职场文书
2016年3月份红领巾广播稿
2015/12/21 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
Golang jwt身份认证
2022/04/20 Golang