zoukankan      html  css  js  c++  java
  • ThinkPHP 中使用 IS_AJAX 判断原生 JS 中的 Ajax 出现问题

    问题:

    在 ThinkPHP 中使用原生 js 发起 Ajax 请求的时候、在控制器无法使用 IS_AJAX 进行判断。而使用 jQuery 中的 ajax 是没有问题的。

    在ThinkPHP中、有一个判断是 ajax 请求的常量 IS_AJAX;

    Ajax 请求常用的有两种情况:一种是原生 js 的 ajax 请求、一种是 jQuery 的 ajax 请求。

    分析:

    先看看使用 jQuery 中使用 ajax 发送请求的时候的头信息:
    Accept: application/json, text/javascript, */*; q=0.01
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
    Connection: keep-alive
    Content-Length: 22
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Cookie: PHPSESSID=ns9mjve234erh0qerlcl180v52
    Host: localhost
    Origin: http://localhost
    Referer: http://localhost/ok/
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/547.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/547.36
    X-Requested-With: XMLHttpRequest
    
    再看看使用 JS 中的原生 ajax 发送请求的时候的头信息:
    Accept: */*
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
    Connection: keep-alive
    Cookie: PHPSESSID=ns9mjve234erh0qerlcl180v52
    Host: localhost
    Referer: http://localhost/tp/
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/547.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/547.36
    
    再查看在TP是如何定义的常量 IS_AJAX:

    在 tp3.2.3 版本中
    ThinkPHPLibraryThinkApp.class.php (Line:49)

    define('IS_AJAX',       ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || !empty($_POST[C('VAR_AJAX_SUBMIT')]) || !empty($_GET[C('VAR_AJAX_SUBMIT')])) ? true : false);
    
    你会发现如下:

    使用 jquery 发送 ajax 请求的时候、比使用原生 js 中的 ajax 多一个请求头 X-Requested-With: XMLHttpRequest。

    而且 ThinkPHP 就是利用判读是否存在请求头这种原理去定义常量 IS_AJAX 的。

    那怎么解决这个问题呢?

    在发送ajax请求的时候设置一个对应的请求头信息。

    function page( page )
    {
        var ajax = new XMLHttpRequest()
        ajax.open( 'get', '__URL__/show?page='+page, true )
        ajax.setRequestHeader("X-Requested-With", "XMLHttpRequest");
        ajax.send()
        ajax.onreadystatechange = function ()
        {
            if ( ajax.readyState == 4 && ajax.status == 200 ) 
            {
                document.getElementById( 'box' ).innerHTML = ajax.responseText;
            }
        }
    }
    

    设置完之后、再次看请求头信息、与之前的对比、多了一条

    Accept: */*
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
    Connection: keep-alive
    Cookie: PHPSESSID=ns9mjve234erh0qerlcl180v52
    Host: localhost
    Referer: http://localhost/tp/index.php/Home/Index/show
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/547.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/547.36
    X-Requested-With: XMLHttpRequest
    

    如此问题便解决了。

  • 相关阅读:
    hdoj 3599 最小费用最大流
    poj 2516 最小费用最大流
    poj 3281 最大流拆点
    poj 3436 网络最大流加打印路径
    邻接表模板
    hdu 2102 搜索
    hdoj 1533 最小费用最大流
    HDU 1231 最大连续子序列
    NYOJ 2 括号配对问题
    POJ 1163 / NYOJ 16 The Triangle(数字三角形)
  • 原文地址:https://www.cnblogs.com/laowenBlog/p/10252275.html
Copyright © 2011-2022 走看看