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 相关文章推荐
phpmyadmin 访问被拒绝的真实原因
Jun 15 PHP
PHP目录函数实现创建、读取目录教程实例
Jan 13 PHP
PHP执行批量mysql语句的解决方法
May 02 PHP
PHP与MYSQL中UTF8编码的中文排序实例
Oct 21 PHP
PHP实现抓取HTTPS内容
Dec 01 PHP
微信公众平台接口开发入门示例
Dec 24 PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 PHP
最新版本PHP 7 vs HHVM 多角度比较
Feb 14 PHP
PHP实现的简单分页类及用法示例
May 06 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
Laravel框架控制器,视图及模型操作图文详解
Dec 04 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
Aug 26 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
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
用PHP编写PDF文档生成器
2006/10/09 PHP
使用PHP破解防盗链图片的一个简单方法
2014/06/07 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
2016/02/19 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
php 输出缓冲 Output Control用法实例详解
2020/03/03 PHP
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
Python读大数据txt
2016/03/28 Python
python抓取京东小米8手机配置信息
2018/11/13 Python
将python文件打包成EXE应用程序的方法
2019/05/22 Python
python 使用shutil复制图片的例子
2019/12/13 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
代码总结Python2 和 Python3 字符串的区别
2020/01/28 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
香港交友网站:be2香港
2018/07/22 全球购物
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
小学学习雷锋活动总结
2014/07/03 职场文书
中国梦演讲稿开场白
2014/08/28 职场文书
logback如何自定义日志存储
2021/08/30 Java/Android
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle