我在後台處理ajax和一般的網頁請求時,一般是需要額外加個引數進行區分的。比如使用get引數的is_ajax=1
,後台判斷有is_ajax=1
成立時,表明該請求是ajax請求,遂可區分處理。我正在使用的電商**tpshop裡邊我遇到的都這樣處理,如果乙個介面可同時處理網頁和jax的話,需要使用is_ajax來區分。
但我在看thinkphp5的官方手冊時,遇到裡邊說:
預設情況下,控制器在ajax請求會對返回型別自動轉換,預設為json。還有:
error方法會自動判斷當前請求是否屬於 ajax 請求,如果屬於ajax請求則會自動轉換為default_ajax_return配置的格式返回資訊。這兩處分明就不是用
is_ajax
來區分網頁和ajax請求的,那到底是什麼原理呢?
翻一下原始碼:
/**
* 當前是否ajax請求
* @access public
* @param bool $ajax true 獲取原始ajax請求
* @return bool
*/public function isajax($ajax = false)
else
}
原來是根據$_server[『http_x_requested_with『]
來設別的,所有的ajax請求都會帶這個標識嗎?
在半夜寒羽的部落格中有觀點:
在傳送ajax請求的時候,我們可以通過xmlhttprequest這個物件,建立自定義的header頭資訊, 在jquery框架中,對於通過它的$.ajax,$.get, or $.post方法請求網頁內容時,它會向伺服器傳遞乙個但又有網友遇到有些ajax框架是不帶這個資訊的,這就比較坑了,想想這又不是標準規範,帶不帶確實都得看個性的。所以,還是自己搞個http_x_requested_with
的引數,php中就是在header一層判斷是否是ajax請求,對應的根據$_server['http_x_requested_with']
判斷。
is_ajax
變數做判斷妥一些。如果是自己開發的**,用的是jquery,應該也無所謂了。
在看原始碼的時候隨便看到了:
/**
* 當前是否pjax請求
* @access public
* @param bool $pjax true 獲取原始pjax請求
* @return bool
*/public function ispjax($pjax = false)
else
}
看來有乙個非標準約束的標誌出現了http_x_pjax
。(非標準的好像都帶上『x』)。
那pjax又是什麼玩意?我簡單將我查閱的資料摘錄一下。
history api中有幾個新特性,分別是history.pushstate和history.replacestate,我們把pushstate+ajax進行封裝,合起來簡單點叫,就是pjax。如何使用:
將jquery.pjax.js部署到你的頁面中,將需要使用pjax的a鏈結進行繫結(不能繫結外域的url),如:
$('a').pjax();
至於後台,跟處理ajax一樣,只是用http_x_pjax
來區分是否是pjax請求。
主要參考資料:
1、 php判斷ajax請求:http_x_requested_with-end-2、 http之x-requested-with分析和思考
3、 pjax的實現與應用
4、 pjax:ajax和pushstate結合的js庫
PHP 服務端偽 Ajax 請求
有時候,你可能有這樣的需求,我們的a程式在處理客戶端的請求時,想要以使用者的身份給我們的b程式傳送乙個請求,但是又不想等待它的請求結果,有什麼樣的方法來解決這樣的情景呢?這時候,我們必須以socket的方式來建立乙個鏈結,然後把我們的請求資料以get或者post的方式傳遞過去,而無須等待它的響應結果...
服務端配置實現AJAX跨域請求
一直以為ajax跨域是無法逾越的鴻溝,最近發現原來在服務端可以通過傳送header資訊來允許ajax跨域請求。php 示例 複製 如下 header access control allow origin header access control allwww.cppcns.comow heade...
SSRF(服務端請求偽造)
ssrf server side request forgery 伺服器端請求偽造 是一種由攻擊者構造形成由服務端發起請求的乙個安全漏洞。一般情況下,ssrf攻擊的目標是從外網無法訪問的內部系統。正是因為它是由服務端發起的,所以它能夠請求到與它相連而與外網隔離的內部系統 作為web安全萌新,以上晦澀...