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读取MySQL数据代码
Jun 05 PHP
PHP 多进程 解决难题
Jun 22 PHP
PHP教程 预定义变量
Oct 23 PHP
ThinkPHP分页类使用详解
Mar 05 PHP
PHP正则提取不包含指定网址的图片地址的例子
Apr 21 PHP
分享下php5类中三种数据类型的区别
Jan 26 PHP
php获取字符串中各个字符出现次数的方法
Feb 23 PHP
PHP快速生成各种信息提示框的方法
Feb 03 PHP
Centos PHP 扩展Xchche的安装教程
Jul 09 PHP
PHP和MYSQL实现分页导航思路详解
Apr 11 PHP
php 函数使用可变数量的参数方法
May 02 PHP
PHP保留两位小数的几种方法
Jul 24 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
php打造属于自己的MVC框架
2012/03/07 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
关于laravel后台模板laravel-admin select框的使用详解
2019/10/03 PHP
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
js jquery数组介绍
2012/07/15 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
javascript显示中文日期的方法
2015/06/18 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
2015/08/04 Javascript
原生js实现密码输入框值的显示隐藏
2017/07/17 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
vue-cli中使用高德地图的方法示例
2019/03/28 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
[02:33]DOTA2英雄基础教程 司夜刺客
2013/12/04 DOTA
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
Django框架表单操作实例分析
2019/11/04 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
canvas线条的属性详解
2018/03/27 HTML / CSS
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
楼面经理岗位职责范本
2014/02/18 职场文书
给老婆的道歉信
2015/01/20 职场文书
2016年教师节感言
2015/12/09 职场文书
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL
Java数据结构之堆(优先队列)
2022/05/20 Java/Android