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 相关文章推荐
IIS环境下快速安装、配置和调试PHP5.2.0
Dec 17 PHP
9个PHP开发常用功能函数小结
Jul 15 PHP
php查找任何页面上的所有链接的方法
Dec 03 PHP
php以post形式发送xml的方法
Nov 04 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
Jul 18 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
Mar 04 PHP
Yii2中简单的场景使用介绍
Jun 02 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
May 23 PHP
PHP实现微信申请退款功能
Oct 01 PHP
Laravel框架搜索分页功能示例
Feb 01 PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 PHP
php封装实现钉钉机器人报警接口的示例代码
Aug 08 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
COM in PHP (winows only)
2006/10/09 PHP
PHP 八种基本的数据类型小结
2011/06/01 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
PHP中的常见魔术方法功能作用及用法实例
2015/07/01 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
Javascript图像处理思路及实现代码
2012/12/25 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
2015/09/01 Javascript
Angular ng-class详解及实例代码
2016/09/19 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
收集前端面试题之url、href、src
2018/03/22 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
python在windows命令行下输出彩色文字的方法
2015/03/19 Python
Python三级目录展示的实现方法
2016/09/28 Python
对python中的logger模块全面讲解
2018/04/28 Python
详解Python正则表达式re模块
2019/03/19 Python
python 自动轨迹绘制的实例代码
2019/07/05 Python
使用python socket分发大文件的实现方法
2019/07/08 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
工艺工程师工作职责
2013/11/23 职场文书
工程项目合作意向书
2015/05/08 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书
医德医风学习心得体会
2016/01/25 职场文书
入党心得体会
2019/06/20 职场文书
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server