ajax是一類http請求,天然包含請求頭,和請求體。php
當服務器接收到ajax請求時,爲了專門給ajax返回某一種特定形式(如json)的數據,就須要知道當前請求是不是ajax請求。java
因爲時間的關係,這裏只給出php端判斷請求的頭的方式,至於java,python,C#而言,原理同樣,請求標記name都是一致的,因此只需使用各自的api就能夠實現。python
<?php function isAjax() { if(isset($_SERVER['HTTP_X_REQUESTED_WITH'])) { if('xmlhttprequest'==strtolower($_SERVER['HTTP_X_REQUESTED_WITH'])) { return true; } } return false; } //就這麼簡單 ?>
在PHP中,屬性HTTP_X_REQUEST_WITH來自於底層封裝,若是不想使用 $_SERVER來判斷,能夠使用php提供的 getAllHeaders()來獲取ajax
<?php $headers = getallheaders(); //能夠遍歷一下 while (list($header, $value) = each($headers)) { echo "$header: $value<br>\n"; } //$headers是一個數組,也能夠使用已知的key讀取數據,來判斷是不是ajax請求 if(isset($headers['x-request-with']) && $headers['x-request-with']=='xmlhttprequest') { echo 'yes'; } ?>
在java中也同樣spring
//使用 servlet或者struts2,springmvc中的request訪問 String xhr = request.getHeader('x-request-with'); if('xmlhttprequest'.equal(xhr)){ }
因此,在某些框架如ThinkPHP,直接將這個狀態封裝成常量json
<?php $isAjaxRequest = isAjax(); defined('IS_AJAX') or define('IS_AJAX',$isAjaxRequest); defined('IS_POST') or define('IS_POST',$_SERVER['REQUEST_METHOD']=='POST') ///...... if(IS_AJAX && IS_POST) { //.... } ?>