浅析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 相关文章推荐
客户端静态页面玩分页
Jun 26 Javascript
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
May 24 Javascript
Firefox中beforeunload事件的实现缺陷浅析
May 03 Javascript
javascript实现图片上传前台页面
Aug 18 Javascript
更高效的使用JQuery 这里总结了8个小技巧
Apr 13 Javascript
JQuery实现DIV其他动画效果的简单实例
Sep 18 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
May 26 Javascript
原生JS实现小小的音乐播放器
Oct 16 Javascript
JS中实现浅拷贝和深拷贝的代码详解
Jun 05 Javascript
JavaScript获取当前url路径过程解析
Dec 27 Javascript
Element InfiniteScroll无限滚动的具体使用方法
Jul 27 Javascript
解决Vue大括号字符换行踩的坑
Nov 09 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也可以?成Shell Script
2006/10/09 PHP
利用PHP+JS实现搜索自动提示(实例)
2013/06/09 PHP
简单的php购物车代码
2020/06/05 PHP
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
解决JS浮点数运算出现Bug的方法
2013/03/12 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
2013/05/21 Javascript
jquery移动节点实例
2015/01/14 Javascript
jQuery插件kinMaxShow扩展效果用法实例
2015/05/04 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
2017/06/08 Javascript
React组件生命周期详解
2017/07/03 Javascript
vue基于mint-ui实现城市选择三级联动
2020/06/30 Javascript
webpack分离css单独打包的方法
2018/06/12 Javascript
angularJS自定义directive之带参方法传递详解
2018/10/09 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
Python os模块介绍
2014/11/30 Python
Python中os.path用法分析
2015/01/15 Python
python中管道用法入门实例
2015/06/04 Python
python 读写txt文件 json文件的实现方法
2016/10/22 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
python语言中有算法吗
2020/06/16 Python
SQL注入攻击的种类有哪些
2013/12/30 面试题
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
会计出纳岗位职责
2013/12/25 职场文书
小学数学教学经验交流材料
2014/05/22 职场文书
罚款通知怎么写
2015/04/22 职场文书
民事答辩状格式范文
2015/05/21 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL
MySQL索引失效场景及解决方案
2022/07/23 MySQL