• PHP判断ajax请求:HTTP_X_REQUESTED_WITH


    有时我们需要判断是不是ajax请求来决定模块输出还是json格式输出.

    PHP判断ajax请求的原理:

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

    1. /**
    2.   * 当前请求是否ajax请求
    3.   *
    4.   * @access public
    5.   * @return bool
    6.   */
    7.  function isAjax()
    8.  {
    9.      return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'XMLHttpRequest';
    10.  }

    注意:

    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请求:

      1. switch ($_SERVER['HTTP_ACCEPT']){  
      2.     case 'application/json, text/javascript, */*':  
      3.         //  JSON 格式  
      4.         break;  
      5.     case 'text/javascript, application/javascript, */*':  
      6.         // javascript 或 JSONP 格式  
      7.         break;  
      8.     case 'text/html, */*':  
      9.         //  HTML 格式  
      10.         break;  
      11.     case 'application/xml, text/xml, */*':  
      12.         //  XML 格式  
      13.         break;  
      14. }
    1. 原文:http://yanue.net/post-107.html
  • 相关阅读:
    tps,qps
    JS打包与代码分割
    css module
    垃圾回收算法、内存管理
    css flex布局
    angularJS transclude
    JS模块之AMD, CMD, CommonJS、UMD和ES6模块
    js event loop事件循环
    bootstrap3之栅格系统
    viewport理解
  • 原文地址:https://www.cnblogs.com/phpxuetang/p/4389514.html
Copyright © 2020-2023  润新知