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控制台报错 ...
随机推荐
- POJ - 1113 Wall (凸包模板) Graham Scan 算法实现
Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...
- docker部署showdoc以及linux网关配置
docker 部署showdoc 准备工作: 切换为root用户 su root 更换为阿里云yum源 curl -o /etc/yum.repos.d/CentOS-Base.repo http:/ ...
- KVM 核心功能:CPU 虚拟化
1 vCPU 简介 CPU 负责计算机程序指令的执行.QEMU-KVM 提供对虚拟机 CPU 的模拟,对于虚拟机来说,其拥有的 CPU 是真实的, 和物理 CPU 没有区别. 实际上,虚拟机在 hos ...
- 我想快速给WPF程序添加托盘菜单
我想快速给WPF程序添加托盘菜单 1 简单要求: 使用开源控件库 在XAML中声明托盘菜单,就像给控件添加ContextMenu一样 封装了常用命令,比如:打开主窗体.退出应用程序等 我在Termin ...
- 使用Docker部署java项目时遇到的几个错误
0.简介 本文主要是在学习黑马程序员Docker快速入门到项目部署过程中, 对遇到的问题进行了相关的总结梳理 1.本地已存在mysql服务占用3306端口 问题 当我使用docker run -d - ...
- [转帖]Unicode标准中定义的3个私有使用区域-一个基本区域+两个补充区域
Unicode私有使用区域 目录 1.概述 2.Unicode标准中的描述 2.1.基本多语言平面的私有区域 2.2.补充私有区域 2.3.私有区域位置 3.实际测试 3.1.测试代码 3.2.测试结 ...
- oceanbase部署维护命令学习
oceanbase部署维护命令学习 背景 之前学习过TIDB数据库, 最近又准备学习一下Oceanbase数据库 发现其实两者还是比较相似的. 比较大的区别在于. TiDB是完全开源的, 并且比较明确 ...
- [转帖]Fluentd 的优缺点
https://zhuanlan.zhihu.com/p/129375187 以前在不少场合浅度使用过 Fluentd,将日志汇聚到一个地方.它给我的大体印象是 简单且能解决问题 直到最近遇到一个 ...
- [转帖]Python基础之判断和循环(三)
https://www.jianshu.com/p/5a7552821c63 一.判断 关于判断,跟字面意思一样,就是判断某一个时刻应不应该做某件事: 语法: if 判断条件: 执行语句-- else ...
- [转帖]egrep及扩展的正则表达式
egrep: egrep = grep -E 语法:egrep [选项] PATTERN [FILE...] 扩展正则表达式的元字符: 字符匹配: .:匹配任意单个字符: [ ]:匹配指定范围内的任意 ...