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生成带有雪花背景的验证码
Sep 28 PHP
不要轻信 PHP_SELF的安全问题
Sep 05 PHP
几个有用的php字符串过滤,转换函数代码
May 01 PHP
关于js与php互相传值的介绍
Jun 25 PHP
php的dl函数用法实例
Nov 06 PHP
php array_merge函数使用需要注意的一个问题
Mar 30 PHP
PHP常用处理静态操作类
Apr 03 PHP
php下载文件,添加响应头的简单实例
Sep 22 PHP
PHP使用Redis替代文件存储Session的方法
Feb 15 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
Mar 22 PHP
PHP数据源架构模式之表入口模式实例分析
Jan 23 PHP
PHP如何解决微信文章图片防盗链
Dec 09 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
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
Array对象方法参考
2006/10/03 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
2016/01/08 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
JQuery的attr 与 val区别
2016/06/12 Javascript
AngularJS基础 ng-show 指令简单示例
2016/08/03 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
小程序api实现promise封装过程解析
2019/11/21 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
解决Vue 刷新页面导航显示高亮位置不对问题
2019/12/25 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
Openlayers学习之加载鹰眼控件
2020/09/28 Javascript
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
python搭建微信公众平台
2016/02/09 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
wxPython的安装与使用教程
2018/08/31 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
由面试题加深对Django的认识理解
2019/07/19 Python
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
全球工业:Global Industrial
2020/02/01 全球购物
人力资源管理专业自荐书
2014/07/07 职场文书
努力学习保证书
2015/02/26 职场文书