ajax中的同步异步和跨域请求
ajax中的同步异步和跨域请求
同步异步
demo.html
<script>
$.ajax({
type: "get",
async: false,
data: "random="+Math.random(),
url: "get_data.php",
dataType: "json",
success: function(data) {
console.log(data.a);
},
error: function() {
console.log('Request Error.');
}
});
console.log('xxxxxxxxxxxxxxx');
</script>
get_data.php
$_arr= array('a'=>1,'b'=>2,'c'=>3);
$_result = json_encode($_arr);
sleep(10);
echo $_result;
一、同源政策
1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。
最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同"。
- 协议相同
- 域名相同
- 端口相同
举例来说,http://www.example.com/dir/page.html这个网址,协议是http://,域名是www.example.com,端口是80
同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据 具体查看同源政策
二、3种方法规避同源限制
1、页面上引入不同域上的js脚本
<script>
//回调函数
function showData(result) {
var data = JSON.stringify(result); //json对象转成字符串
$("#text").val(data);
}
$(function(){
$('#bt').click(function(){
$("head").append("<script src='http://localhost:8083/get_data.php?callback=showData'><\/script>");
});
})
</script>
服务器端
function isAjax() {
return @$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ? true : false;
}
header("content-type:application/json;charset=utf-8");
$_arr = array('name'=>'jack','age'=>18,'sex'=>1);
$_result = json_encode($_arr);
$_callback = $_GET['callback'];//关键在这。配合客户端JS使用
echo $_callback."($_result)";//php用点号实现字符串拼接
2. jquery的jsonp方式跨域请求
最简单的方式,只需配置一个dataType:'jsonp',就可以发起一个跨域请求。jsonp指定服务器返回的数据类型为jsonp格式,可以看发起的请求路径,自动带了一个callback=xxx,xxx是jquery随机生成的一个回调函数名称
$('#bt').click(function(){
$.ajax({
url: "http://localhost:8083/get_data.php",
type: "GET",
dataType: "jsonp", //指定服务器返回的数据类型
success: function (data) {
var result = JSON.stringify(data); //json对象转成字符串
$("#text").val(result);
}
});
});
3.使用jsonpCallback
<script>
//回调函数
function showData(result) {
var data = JSON.stringify(result); //json对象转成字符串
$("#text").val(data);
}
$(function(){
$('#bt').click(function(){
$.ajax({
url: "http://localhost:8083/get_data.php",
type: "GET",
dataType: "jsonp", //指定服务器返回的数据类型
jsonpCallback: "showData",
success: function (data) {
console.log(data);
}
});
});
})
</script>
三、Ajax跨域资源共享:CORS
CORS,又称跨域资源共享,英文全称Cross-Origin Resource Sharing。假设我们想使用Ajax从a.com的页面上向b.com的页面上要点数据,通常情况由于同源策略,这种请求是不允许的,浏览器也会返回“源不匹配”的错误,所以就有了“跨域”这个说法。但是我们也有解决办法,我们可以再b.com的页面header信息中增加一行代码:
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Origin: http://www.helloweba.com");
示例:通过CORS跨域请求数据 域名:www.abc.com 下
<script>
$.ajax({
type: "get",
data: "random="+Math.random(),
url: "http://www.study.com/ajax/get_data.php",
dataType: "json",
success: function(data) {
console.log(data.a);
},
error: function() {
console.log('Request Error.');
}
});
</script>
域名www.study.com下
header("Access-Control-Allow-Origin: http://www.abc.com");
$_arr = array('a'=>1,'b'=>2,'c'=>3);
$_result = json_encode($_arr);
exit($_result);
多个域名情况
$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';
$allow_origin = array(
'http://www.study.com',
'http://client2.runoob.com'
);
if(in_array($origin, $allow_origin)){
header('Access-Control-Allow-Origin:'.$origin);
}
ajax中的同步异步和跨域请求的更多相关文章
- 【转】solr+ajax智能拼音详解---solr跨域请求
本文转自:http://blog.csdn.net/wangzhaodong001/article/details/8529090 最近刚做完solr的ajax智能拼音.总结一下. 前端:jQuery ...
- nodeJS中express框架设置全局跨域请求头
//设置跨域请求头 router.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin&qu ...
- ajax获取json数据及实现跨域请求
最近想练习一下ajax获取json数据 , 首先上网找一些在线的可用来测试的接口. -----------------------------------------------------这里是接口 ...
- mvc中使用jsonp进行跨域请求详细说明
在web开发中,如果你要在不同域下进行数据异步请求,会出现一个No ‘Access-Control-Allow-Origin’ header is present on the requested r ...
- AJAX跨域请求详解
最近开始学习ajax,学习ajax必须得掌握的就是跨域请求,实际上在不同源的地址上发送请求就是跨域请求 域名地址的组成: http:// www . google : 8080 / script/jq ...
- ajax跨域请求Flask后台
ajax中使用jsonp方式实现跨域 headers: {'Cookie' : document.cookie } #携带cookie xhrFields: { withCredentials: tr ...
- Ajax跨域请求怎么解决?
前言 项目中需要将第三方系统中,对应用户的代办消息集成到系统中.对方提供了获取对应用户的接口url,但是由于两边的系统是部署到客户现场不同IP的虚机上的,所以进行ajax请求的时候是属于跨域请求的.之 ...
- CORS跨域请求规则以及在Spring中的实现
CORS: 通常情况下浏览器禁止AJAX从外部获取资源,因此就衍生了CORS这一标准体系,来实现跨域请求. CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origi ...
- SpringBoot多跨域请求的支持(JSONP)
在我们做项目的过程中,有可能会遇到跨域请求,所以需要我们自己组装支持跨域请求的JSONP数据,而在4.1版本以后的SpringMVC中,为我们提供了一个AbstractJsonpResponseBod ...
- 跨域请求配置 Amazon AWS S3 腾讯云 阿里云 COS OSS 文件桶解决方案以及推荐 Lebal:Research
跨域请求配置 跨域请求指的就是不同的域名和端口之间的访问.由于 ajax 的同源策略影响.跨域请求默认是不被允许的. 使用@font-face外挂字体时,可能遇到跨域请求CROS问题:F12控制台报错 ...
随机推荐
- AtCoder Beginner Contest 211 (C ~ E) 个人题解
比赛链接:Here A.B题跳过 C - chokudai 题意: 给出一个字符串,问有多少个字串能构成 chokudai 这道题算是一个简单DP,只要计算某个位置对构成 chokudai 的贡献值即 ...
- [工程开发]当我们写一个tcp服务端的时候,我们在写什么?(一)
当我们写一个tcp服务器和客户端的时候,我们在写什么?(一) 本篇只聊服务端. 最近想搞一个服务器的协议,然后捏,简单搓个tcp服务器协议看看效果,主要是最近实在是没事干,闲得没事搓个服务器看看,当然 ...
- 一文看完String的前世今生,内容有点多,请耐心看完!
写在开头 String字符串作为一种引用类型,在Java中的地位举足轻重,也是代码中出现频率最高的一种数据结构,因此,我们需要像分析Object一样,将String作为一个topic,单独拿出来总结, ...
- Angular系列教程之单向绑定与双向绑定
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- 【收集】Tool
序 链接 备注 1 WinMerge - You will see the difference- 开源windows比对工具 2 AykutSarac/jsoncrack.com: Seamless ...
- [转帖]goproxy 使用说明
Go 版本要求 建议您使用 Go 1.13 及以上版本, 可以在这里下载最新的 Go 稳定版本. 配置 Goproxy 环境变量 Bash (Linux or macOS) export GOPROX ...
- [转帖]Redhat 8 磁盘调度策略变化:NOOP改为NONE
说明 在 redhat 4/5/6/7版本中的NOOP调度策略,从8开始修改为NONE,官方解释: none Implements a first-in first-out (FIFO) schedu ...
- [转帖]Python-Mock接口测试
https://www.cnblogs.com/zhangwuxuan/p/12928850.html 前言 今天跟小伙伴们一起来学习一下如何编写Python脚本进行mock测试. 什么是mock? ...
- 【转帖】【ethtool】ethtool 网卡诊断、调整工具、网卡性能优化| 解决丢包严重
目录 即看即用 详细信息 软件简介 安装 ethtool的使用 输出详解 其他指令 将 ethtool 设置永久保存 如何使用 ethtool 优化 Linux 虚拟机网卡性能 ethtool 解决网 ...
- [转帖]Python基础之函数(四)
https://www.jianshu.com/p/168e341fb81c 一.函数定义 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段:比如常用的print(),就是内建函数:通 ...