PHP判断ajax请求的原理:

在发送ajax请求的时候,我们可以通过XMLHttpRequest这个对象,创建自定义的 header头信息, 在jquery框架中,对于通过它的$.ajax, $.get, or $.post方法请求网页内容时,它会向服务器传递一个HTTP_X_REQUESTED_WITH的参数,php中就是在header一层判断是否是 ajax请求,对应的根据$_SERVER['HTTP_X_REQUESTED_WITH']判断。

    /**
* 当前请求是否ajax请求
*
* @access public
* @return bool
*/
function isAjax()
{
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'XMLHttpRequest';
}

PHP判断AJAX请求时跨域问题:

如果是跨域的话这个,上面的isAjax就完全不正确了。跨域同域的问题参考:《$.getjson遇到的几个问题》使用$.getJSON来实现跨域,但是检测是否是ajax一直是false,并尝试$get(参看:$.get实现返回解析json数据以及jsonp跨域)之后无果的之后,考虑要使用万能的$ajax方法,见ajax的文档:

如 果指定了script或者jsonp类型,那么当从服务器接收到数据时,实际上是用了<script>标签而不是 XMLHttpRequest对象。这种情况下,$.ajax()不再返回一个XMLHttpRequest对象,并且也不会传递事件处理函数,比如 beforeSend。

解释:

ajax跨域只能指定jsonp格式的数据,这个是就不是XMLHttpRequest对象了,就算你自定义一个$_SERVER['HTTP_X_REQUESTED_WITH']也是没有意义的

解决的办法:

针对跨域情况的getjson 或者ajax(jsonp)可以使用ACCEPT请求头部格式来判断

PHP端对应$_SERVER['HTTP_ACCEPT']

jsonp的请求一般是:text/javascript, application/javascript, */*

json的请求:application/json, text/javascript, */*

一个简单的判断跨域条件下的ajax请求:

    switch ($_SERVER['HTTP_ACCEPT']){
case 'application/json, text/javascript, */*':
// JSON 格式
break;
case 'text/javascript, application/javascript, */*':
// javascript 或 JSONP 格式
break;
case 'text/html, */*':
// HTML 格式
break;
case 'application/xml, text/xml, */*':
// XML 格式
break;
}

PHP判断ajax请求:HTTP_X_REQUESTED_WITH的更多相关文章

  1. php后台判断ajax请求

    if (isset($_SERVER["HTTP_X_REQUESTED_WITH"]) && $_SERVER["HTTP_X_REQUESTED_WI ...

  2. 后台判断ajax请求的请求后字段

    headers设置:X-Requested-With:XMLHttpRequest    后台我就是根据这个来判断的

  3. AJAX 请求区分 $_SERVER['HTTP_X_REQUESTED_WITH'] 小解

    关于这个内容,很多人都有所了解.但从我搜索的内容来看,他们只是略微看一下,根本不知道里面到底是什么情况. 受到很多模版代码的影响,大家都以为PHP有这样一个自定义变量:$_SERVER['HTTP_X ...

  4. 利用闭包实现多次ajax请求只执行最后一次

    点一个按钮,则向服务器请求资源,不作处理时,多次点击后会有很多个请求在等待.我们知道一般我们用ajax是异步请求,那么我们快速重复点击一个按钮得到的结果其实我们并不知道是哪次点击的结果可能是第一次可能 ...

  5. springboot+shiro 02 - 异步ajax请求无权限时,返回json格式数据

    博客: https://www.cnblogs.com/youxiu326/p/shiro-01.html github:https://github.com/youxiu326/sb_shiro_s ...

  6. PHP判断请求是否是ajax请求

    首先看一下框架里面是怎样判断的.ThinkPHP:define('IS_AJAX', ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && str ...

  7. PHP 判断是否为 AJAX 请求

    先说前端使用 jQuery 时怎么区分: jQuery 发出 ajax 请求时,会在请求头部添加一个名为 X-Requested-With 的信息,信息内容为:XMLHttpRequest 在后端可以 ...

  8. 如何在Global.asax中判断是否是ajax请求

    今天在一个应用场景中需要在Global.asax中判断一个请求是否是ajax请求,而在ASP.NET MVC中已经提供了一个现成的扩展方法IsAjaxRequest: namespace System ...

  9. Java过滤器应用-对Ajax请求做Session失效判断

    过滤器常用来对Session过期做判断 Layout.js 1.为ajax请求添加标识 2.无论ajax请求成功与否,complete函数终会执行 // 全局Ajax设置, 用于session过期后的 ...

随机推荐

  1. 分布式配置 tachyon 并执行Hadoop样例 MapReduce

    ----------此文章.笔者按着tachyon官网教程进行安装并记录. (本地安装tachyon具体解释:http://blog.csdn.net/u012587561/article/detai ...

  2. Groovy 学习手册(3)

    五. Groovy 的设计模式 设计模式是一种非常好的方式,可以使你的代码变得实用,可读又具有扩展性.跟 Java 相比,在 Groovy 里使用设计模式使代码更加简洁和容易. 1. 策略模式 设想一 ...

  3. matlab入门笔记(七):数据文件I/O

  4. Redis使用问题及知识点记录 - 待整理

    介绍 官网:https://redis.io/commands/expire spring data redis 整合redis使用方法 spring 整合api :http://docs.sprin ...

  5. 物联网将在2018年实现大规模发展--IBM的四大预测

    物联网将在2018年实现大规模发展--IBM的四大预测    数据是数字化变革的基本组成部分,物联网.人工智能.区块链.边缘计算等技术预计将在来年掀起巨浪, 因为这些技术是收集.分析和存储信息的方法. ...

  6. 通过maven中properties标签定义spring版本号

    一 发现问题 在pom.xml中添加依赖时语法如下 <dependency>  <groupId>org.springframework</groupId>  &l ...

  7. 安装MySQL start Service(无法启动服务)

    在xp是这样:  C:\ProgramData\MySQL  在win7 或者win8 在C:\ProgramData\MySQL   这里还有MySQL的文件,必须要删除    注意:Applica ...

  8. Atitit 我们的devops战略与规划 规范 推荐标准

    Atitit 我们的devops战略与规划 规范 推荐标准 1. Vm容器化1 2. 热部署tomcat+jrebel 或者resin1 3. 增量更新与差异更新1 4. 补丁提取与应用2 为了方便提 ...

  9. Backpropagation In Convolutional Neural Networks

    http://www.jefkine.com/general/2016/09/05/backpropagation-in-convolutional-neural-networks/ http://w ...

  10. [Windows Azure] How to use the Queue Storage Service

    How to use the Queue Storage Service version 1.7 version 2.0 This guide will show you how to perform ...