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中的同步异步和跨域请求的更多相关文章

  1. 【转】solr+ajax智能拼音详解---solr跨域请求

    本文转自:http://blog.csdn.net/wangzhaodong001/article/details/8529090 最近刚做完solr的ajax智能拼音.总结一下. 前端:jQuery ...

  2. nodeJS中express框架设置全局跨域请求头

    //设置跨域请求头 router.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin&qu ...

  3. ajax获取json数据及实现跨域请求

    最近想练习一下ajax获取json数据 , 首先上网找一些在线的可用来测试的接口. -----------------------------------------------------这里是接口 ...

  4. mvc中使用jsonp进行跨域请求详细说明

    在web开发中,如果你要在不同域下进行数据异步请求,会出现一个No ‘Access-Control-Allow-Origin’ header is present on the requested r ...

  5. AJAX跨域请求详解

    最近开始学习ajax,学习ajax必须得掌握的就是跨域请求,实际上在不同源的地址上发送请求就是跨域请求 域名地址的组成: http:// www . google : 8080 / script/jq ...

  6. ajax跨域请求Flask后台

    ajax中使用jsonp方式实现跨域 headers: {'Cookie' : document.cookie } #携带cookie xhrFields: { withCredentials: tr ...

  7. Ajax跨域请求怎么解决?

    前言 项目中需要将第三方系统中,对应用户的代办消息集成到系统中.对方提供了获取对应用户的接口url,但是由于两边的系统是部署到客户现场不同IP的虚机上的,所以进行ajax请求的时候是属于跨域请求的.之 ...

  8. CORS跨域请求规则以及在Spring中的实现

    CORS: 通常情况下浏览器禁止AJAX从外部获取资源,因此就衍生了CORS这一标准体系,来实现跨域请求. CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origi ...

  9. SpringBoot多跨域请求的支持(JSONP)

    在我们做项目的过程中,有可能会遇到跨域请求,所以需要我们自己组装支持跨域请求的JSONP数据,而在4.1版本以后的SpringMVC中,为我们提供了一个AbstractJsonpResponseBod ...

  10. 跨域请求配置 Amazon AWS S3 腾讯云 阿里云 COS OSS 文件桶解决方案以及推荐 Lebal:Research

    跨域请求配置 跨域请求指的就是不同的域名和端口之间的访问.由于 ajax 的同源策略影响.跨域请求默认是不被允许的. 使用@font-face外挂字体时,可能遇到跨域请求CROS问题:F12控制台报错 ...

随机推荐

  1. POJ - 1113 Wall (凸包模板) Graham Scan 算法实现

    Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...

  2. docker部署showdoc以及linux网关配置

    docker 部署showdoc 准备工作: 切换为root用户 su root 更换为阿里云yum源 curl -o /etc/yum.repos.d/CentOS-Base.repo http:/ ...

  3. KVM 核心功能:CPU 虚拟化

    1 vCPU 简介 CPU 负责计算机程序指令的执行.QEMU-KVM 提供对虚拟机 CPU 的模拟,对于虚拟机来说,其拥有的 CPU 是真实的, 和物理 CPU 没有区别. 实际上,虚拟机在 hos ...

  4. 我想快速给WPF程序添加托盘菜单

    我想快速给WPF程序添加托盘菜单 1 简单要求: 使用开源控件库 在XAML中声明托盘菜单,就像给控件添加ContextMenu一样 封装了常用命令,比如:打开主窗体.退出应用程序等 我在Termin ...

  5. 使用Docker部署java项目时遇到的几个错误

    0.简介 本文主要是在学习黑马程序员Docker快速入门到项目部署过程中, 对遇到的问题进行了相关的总结梳理 1.本地已存在mysql服务占用3306端口 问题 当我使用docker run -d - ...

  6. [转帖]Unicode标准中定义的3个私有使用区域-一个基本区域+两个补充区域

    Unicode私有使用区域 目录 1.概述 2.Unicode标准中的描述 2.1.基本多语言平面的私有区域 2.2.补充私有区域 2.3.私有区域位置 3.实际测试 3.1.测试代码 3.2.测试结 ...

  7. oceanbase部署维护命令学习

    oceanbase部署维护命令学习 背景 之前学习过TIDB数据库, 最近又准备学习一下Oceanbase数据库 发现其实两者还是比较相似的. 比较大的区别在于. TiDB是完全开源的, 并且比较明确 ...

  8. [转帖]Fluentd 的优缺点

    https://zhuanlan.zhihu.com/p/129375187   以前在不少场合浅度使用过 Fluentd,将日志汇聚到一个地方.它给我的大体印象是 简单且能解决问题 直到最近遇到一个 ...

  9. [转帖]Python基础之判断和循环(三)

    https://www.jianshu.com/p/5a7552821c63 一.判断 关于判断,跟字面意思一样,就是判断某一个时刻应不应该做某件事: 语法: if 判断条件: 执行语句-- else ...

  10. [转帖]egrep及扩展的正则表达式

    egrep: egrep = grep -E 语法:egrep [选项] PATTERN [FILE...] 扩展正则表达式的元字符: 字符匹配: .:匹配任意单个字符: [ ]:匹配指定范围内的任意 ...