大多數情況下,我們的 ajax 請求都是通過前端的開發庫、框架發出的,如 jquery、axios 或者 fly。這些庫自身都會有一些請求/響應鉤子,用於預處理 ajax請求和響應。但是,如果你沒有使用這些網路庫,又或是你並不是網頁的開發者,而你需要分析某個網頁的所有ajax請求,又或是你是乙個應用開發者,你的webview中需要攔截所有網頁的網路請求(網頁並不是你開發的)…… 這種時候,你就需要攔截全域性的 ajax 請求.
原理無論你的應用是通過那個框架或庫發起的 ajax 請求,最終都會回歸到 xmlhttprequest 。 所以,攔截的本質就是替換瀏覽器原生的 xmlhttprequest 。具體就是,在替換之前儲存先儲存 xmlhttprequest,然後在請求過程中根據具體業務邏輯決定是否需要www.cppcns.com發起網路請求,如果需要,再建立真正的 xmlhttprequest 例項。
fly 攔截全域性ajax
如果您還不了解 fly, 請參考其官網:
我們知道,在 fly 中,xmlhttprequest 就是乙個http engine。所以我們要攔截,只需要自定義乙個engine替換掉全域性的xmlhttprequest 就行,而 fly 提供了快速生成 engine 的工具,所以我們可以很方便實現攔截。
我們先看乙個簡單的例子,功能是輸出每次網路請求 url 和 method。
實現var log = console.log;
//切換fly engine為真正的xmlhttprequest
})})//覆蓋預設
我們用程式設計客棧 axios 發起乙個請求測試一下:
axios.post("../package.json").then(log)
//控制台輸出
可以看到控制台中輸出了請求的 url 和 method,我們的攔截www.cppcns.com成功了。而 第二行的結果物件是axios then列印出的。
因為 fly支援切換engine, 我們可以直接先將 fly engine 切換為真正的 xmlhttprequest ,然後再覆蓋,這樣fly中的網路請求都是通過真正的 xmlhttprequest 發起的 (事實上, 瀏覽器環境下 fly 預設的 engine本就是 xmlhttprequest,無需手動切換,此處為了清晰,故手動切換了一下)。fly 會根據request物件自動同步請求頭。如果想阻止請求,直接在 adapter 中 return 即可。
其它攔截方法
github上的開源庫 ajax-hook 也可以攔截全域性的的ajax請求,不同的是,它可以攔截ajax請求的每一步,每乙個**,不僅強大,而且也很輕量(1kb)。和上面通過 fly engine 攔截的方式相比 ,ajax-hook的攔截粒度更細,但ajax-hook由於使用了es5的 getter、setter,所以不支援ie9以下的瀏覽器。
最後fly剛剛開源,如果你覺得對您有用,歡迎star,多謝支援 github: httwww.cppcns.comps:
本文標題: fly攔截全域性ajax請求的方法
本文位址:
Ajax hook攔截所有的Ajax請求
在解決同乙個瀏覽器登入多個賬戶,解決sesson覆蓋問題的時候,我想到的辦法是為每乙個使用者的session定義唯一的key,例如 sessionuser accesstoken.accesstoken是登入校驗成功後,生成的唯一字串,你可以使用uuid策略。這樣,我需要給所有的ajax請求帶上這個...
Restful API的請求攔截
1 filter過濾器攔截 可以拿到原始的http請求和響應的資訊,但是拿不到真正處理的這個請求的方法的資訊 如 chain.dofilter request,response 2 interceptor 攔截 可以拿到原始的http請求和響應的資訊,也能拿到處理的這個請求的方法的資訊,但是拿不到該...
Ajax 請求後開啟新視窗被攔截的解決方案
公司業務上有個場景,需請求後台獲取支付鏈結位址,再開啟位址引導使用者購買。這樣的場景在其他企業應該也很場景。但是遇到個很常見的問題,ajax後直接用window.open url 會被瀏覽器作為廣告攔截。解決方案 方案一,在ajax請求前新開預設視窗 let win window.open blan...