ThinkPHP 中使用 IS_AJAX 判断原生 JS 中的 Ajax 出现问题
程序员文章站
2022-04-14 17:03:52
问题: 在 ThinkPHP 中使用原生 js 发起 Ajax 请求的时候、在控制器无法使用 IS_AJAX 进行判断。而使用 jQuery 中的 ajax 是没有问题的。 在ThinkPHP中、有一个判断是 ajax 请求的常量 IS_AJAX; Ajax 请求常用的有两种情况:一种是原生 js ......
问题:
在 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 版本中
\thinkphp\library\think\app.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
如此问题便解决了。
上一篇: 关于c++11中的thread库
下一篇: nginx系列1:认识nginx