PHP处理Ajax请求与Ajax跨域问题


Posted in PHP onFebruary 13, 2017

PHP判断是否为Ajax请求

我们知道,在发送ajax请求的时候,可以通过XMLHttpRequest这个对象,创建自定义的header头信息, 在jquery框架中,对于通过它的$.ajax, $.get, 或者$.post方法请求网页内容时,它会向服务器传递一个HTTP_X_REQUESTED_WITH的参数,php中就是在header一层判断是否是ajax请求,对应的根据$_SERVER['HTTP_X_REQUESTED_WITH']判断。一般情况下$_SERVER['HTTP_X_REQUESTED_WITH']默认是XMLHttpRequest,$_SERVER['HTTP_X_REQUESTED_WITH']也可以自定义创建的,使用XMLHttpRequest.setRequestHeader(name,value)

示例:前端页面发送普通的ajax请求给后端test.php。

$.ajax({
  type: "GET",
  url: 'test.php',
  success: function(data) {
    console.log(data);
  }
});

服务端test.php可以判断该请求是不是Ajax异步请求,然后根据业务需求做出响应的回应。

以下是服务端test.php的简单验证是否为ajax请求的代码:

function isAjax() {
  return @$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ? true : false;
}
if (isAjax()) {
  echo 'Ajax Request Success.';
} else {
  echo 'No.';
}

Ajax发起JSONP跨域请求

我们通过jQuery的JSONP方式可以实现跨域ajax请求,服务端php也需要做出相应的处理,也就是说php这边必须和前端页面按照一定的格式请求和返回数据。

示例:前端页面发起JSONP请求:

$.ajax({
  type: "get",
  data: "random="+Math.random(),
  url: "http://demo.3water.com/phpajax/jsonp.php",
  dataType: "jsonp",
  jsonp: "callback",
  success: function(data) {
   console.log(data);
  },
  error: function() {
   console.log('Request Error.');
  }
});

我们会发现,ajax请求参数中有 dataType: "jsonp" 和 jsonp: "callback" ,这个就表明了我要请求的是jsonp,并且会有回调callback返回。当然,我们也可以自定义回调函数,如 jsonpCallback:"success_jsonpCallback"

还可以简单的写成:

jQuery.getJSON('http://demo.3water.com/phpajax/jsonp.php?callback=?",{
 random: Math.random()
}, function(data){
 console.log(data);
});

php后端服务代码可以这样写(注意输出返回的格式):

$data = array(
  'rand' => $_GET['random'],
  'msg' => 'Success'
);
echo $_GET['callback'].'('.json_encode($data).')';

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:* ”,表示我们已经启用CORS,如果要限制只允许某个域名的请求,可以这样:

header("Access-Control-Allow-Origin: https://3water.com");

示例:通过CORS跨域请求数据

$.ajax({
  type: "get",
  data: "random="+Math.random(),
  url: "http://demo.3water.com/phpajax/ajax.php",
  dataType: "json",
  success: function(data) {
    console.log(data);
    $("#result_3").html(data.msg+':'+data.rand);
  },
  error: function() {
   $("#result_3").html('Request Error.');
  }
});

我们在另一个网站域名下的ajax.php加上这样的代码:

header("Access-Control-Allow-Origin: https://3water.com");
$data = array(
  'rand' => $_GET['random'],
  'msg' => 'Success'
);
echo json_encode($data);

这就实现了从3water.com页面发起跨域异步请求到域名路径demo.3water.com/phpajax/ajax.php,并得到响应。

以上所述是小编给大家介绍的PHP处理Ajax请求与Ajax跨域,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHP新手上路(九)
Oct 09 PHP
用php随机生成福彩双色球号码的2种方法
Feb 04 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
php专用数组排序类ArraySortUtil用法实例
Apr 03 PHP
PHP实现的登录页面信息提示功能示例
Jul 24 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
PHP单元测试框架PHPUnit用法详解
Jan 23 PHP
PHP使用PDO操作sqlite数据库应用案例
Mar 07 PHP
PHP实现百度人脸识别
May 06 PHP
PHP下载文件函数与用法示例
Sep 27 PHP
TP5框架页面跳转样式操作示例
Apr 05 PHP
curl 出现错误的调试方法(必看)
Feb 13 #PHP
PHP中CheckBox多选框上传失败的代码写法
Feb 13 #PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 #PHP
yii2 数据库读写分离配置示例
Feb 10 #PHP
php 基础函数
Feb 10 #PHP
PHP isset()与empty()的使用区别详解
Feb 10 #PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
Feb 10 #PHP
You might like
PHP中一个控制字符串输出的函数
2006/10/09 PHP
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
2016/04/01 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
2016/06/01 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
基于Vue sessionStorage实现保留搜索框搜索内容
2020/06/01 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
VUE+Element实现增删改查的示例源码
2020/11/23 Vue.js
[03:17]DOTA2英雄基础教程 剧毒术士
2013/12/12 DOTA
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
netbeans7安装python插件的方法图解
2013/12/24 Python
python PIL模块与随机生成中文验证码
2016/02/27 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
python使用tornado实现登录和登出
2018/07/28 Python
pytorch 批次遍历数据集打印数据的例子
2019/12/30 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
Python selenium爬虫实现定时任务过程解析
2020/06/08 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
编码实现字符串转整型的函数
2012/06/02 面试题
公司年会搞笑主持词
2014/03/24 职场文书
网络信息安全承诺书
2014/03/26 职场文书
青年文明号服务承诺
2014/03/31 职场文书
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
病人慰问信范文
2015/02/15 职场文书
2015年大学团支部工作总结
2015/05/13 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书