浅析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 相关文章推荐
javascript判断非数字的简单例子
Jul 18 Javascript
js日期相关函数总结分享
Oct 15 Javascript
谷歌浏览器调试JavaScript小技巧
Dec 29 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
Feb 27 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
Apr 07 Javascript
使用AOP改善javascript代码
May 01 Javascript
jQuery UI设置固定日期选择特效代码分享
Aug 27 Javascript
AngularJS equal比较对象实例详解
Sep 14 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
Sep 20 Javascript
webpack4之SplitChunksPlugin使用指南
Jun 12 Javascript
layui表格内容溢出的解决方法
Sep 06 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
Jul 19 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判断变量类型常用方法
2012/04/24 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
php版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
javascript 按回车键相应按钮提交事件
2009/11/02 Javascript
flash 得到自身url参数的代码
2009/11/15 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
文本框水印提示效果的简单实现代码
2014/02/22 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
vue项目强制清除页面缓存的例子
2019/11/06 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
Python面向对象程序设计之类的定义与继承简单示例
2019/03/18 Python
Python虚拟环境的原理及使用详解
2019/07/02 Python
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
使用CSS3和Checkbox实现JQuery的一些效果
2015/08/03 HTML / CSS
Cult Gaia官网:美国生活方式品牌
2019/08/16 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
思想汇报格式
2014/01/05 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书