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 相关文章推荐
Email+URL的判断和自动转换函数
Oct 09 PHP
40个迹象表明你还是PHP菜鸟
Sep 29 PHP
PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
Jul 09 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
Mar 09 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
Feb 18 PHP
基于PHP编程注意事项的小结
Apr 27 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
Dec 25 PHP
php多文件上传下载示例分享
Feb 20 PHP
php获取表单中多个同名input元素的值
Mar 20 PHP
PHP代码优化技巧小结
Sep 29 PHP
Yii框架分页技术实例分析
Aug 30 PHP
让你的PHP,APACHE,NGINX支持大文件上传
Mar 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
PHP中使用Imagick实现各种图片效果实例
2015/01/21 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
Yii2实现自定义独立验证器的方法
2017/05/05 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
一段非常简单的让图片自动切换js代码
2006/11/10 Javascript
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
javascript setTimeout和setInterval计时的区别详解
2013/06/21 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
python生成不重复随机数和对list乱序的解决方法
2018/04/09 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
python发送多人邮件没有展示收件人问题的解决方法
2019/06/21 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
Django之腾讯云短信的实现
2020/06/12 Python
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
JPA面试常见问题
2016/11/14 面试题
会计找工作求职信范文
2013/12/09 职场文书
小学班主任寄语大全
2014/04/04 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
交通事故起诉书
2015/05/19 职场文书
导游词之河北邯郸
2019/09/12 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书