攔截和跟蹤HTTP請求的主要方法及實現

2021-06-22 12:07:47 字數 3224 閱讀 8591

二、方法簡介

名稱

特點

優點

缺點

利用瀏覽器的event

通過對[

滑鼠事件]

,[ 鍵盤事件]

,[html

事件],[mutation

事件]

的監聽,可以對使用者的互動,頁面的變化,特別是標籤節點的變化做出響應

瀏覽器自身支援,**量小,幾乎可以用來控制所有的html 內容

此方法中的mutation event

,firefox2.0

平台已支援,ie6.0

尚未支援

通過aop

技術攔截

可以攔截大部分物件的方法呼叫。

很多js

**庫和框架已經支援aop

技術,**簡單

activex

物件無法有效攔截。無法攔截普通的函式。另外單獨使用此項技術會造成插入點複雜。

覆蓋函式進行攔截

通過編寫同名方法覆蓋系統定義,使用者自定義的函式(

建構函式)

,達到攔截目的,對普通函式的攔截是對aop

的補充。

不依賴其他的**庫和js

框架,對系統函式的覆蓋有很好的效果,可以攔截建構函式用來控制物件的生成。

攔截自定義函式會造成插入點複雜

通過動態**進行攔截

主要用來解決activex

物件的攔截問題,通過構造activex

物件的**物件,實現攔截和跟蹤。

典型的例子如ie

平台下ajax

通訊的攔截

**複雜,屬性更新的同步機制可能導致某些應用異常。

通過自**和html

解析進行攔截

此方法主要解決的是攔截時機的問題,配合上面的方法,就可以實現很多功能,而不必要等待頁面的onload

事件。

實現瀏覽器端頁面載入前攔截的好方法

**複雜

三、方法的實現

1、覆蓋系統類 / 方法進行攔截

覆蓋已定義的函式是在原函式定義後,呼叫前通過定義同名函式,達到攔截和跟蹤的目的。其一般形式多如下面 :

var orifunction = somefunction;

somefunction = function ()

第一步是(第一行**)為了將指向原來函式的指標儲存,以便後續使用。

第二步便是定義同名函式,在同名函式裡面的適當位置呼叫原來的功能。這種方法不但可以跟蹤原來函式,還可以修改和過濾函式的引數,甚至可以修改返回值。當需要操縱引數的時候,只需在新定義的函式中訪問 arguments 物件即可。

例如:針對系統函式 window.open(url,name,specs,replace) 我們可以通過下面的**進行攔截:

var oriwindowopen = window.open;

window.open = function(url,names,specs,replace) 

上面的攔截會導致所有的 window.open 呼叫全部開啟 視窗 。

函式覆蓋的適用範圍較廣,不但可以模擬 aop 的實現,還可以對非物件函式進行操作。函式覆蓋可以根據使用的差異分成若干情況 :

覆蓋建構函式的一般形式 :

var orifunction = somefunction;

somefunction = function ()

2、通過動態**進行攔截

當在 ie6.0 平台遭遇 activex 物件的時候,面對直接的函式覆蓋不能奏效的時候,我們可以考慮通過另外一種辦法,即動態** activex 物件的方式實現攔截和跟蹤。

首先我們通過覆蓋建構函式的方法,將建立 xmlhttprequest 物件的過程進行改造。

varoriactivexobject = activexobject;

activexobject =function(param)

returnobj;};

我們將構造過程攔截下來後,進行自己的改造,主要操作是建立物件,物件中設定與 activex 物件相同的屬性和方法,並且還需要同步屬性方法。

functioncreateactivexagent(ao)catch(e)

};agent.trigstatechange =function()

};agent.activexobject.onreadystatechange = agent.trigstatechange;

agent.abort =function() ;

agent.getallresponseheaders =function()   ;

agent.getresponseheader =function(headerlabel) ;

agent.

open

=function(method,url,asyncflag,username,password) ;

agent.send =function(content) ;

agent.setrequestheader =function(label,value) ;

returnagent;

};從上面的**可以看出來,**物件通過自身的方法模擬了原來 activex 物件的方法。而更關鍵的屬性問題,是通過在函式呼叫前後的屬性同步函式實現的。即:在呼叫**核心方法之前,將屬性從**物件同步給核心物件;在核心方法呼叫之後,將屬性從核心物件同步給**物件。

因為 ajax 物件的屬性幾乎不被使用者寫入,故上面的實現只需要單向屬性同步,即將核心屬性同步給**屬性。對於複雜的應用,可以通過雙向屬性同步函式來解決屬性的**問題。

這種動態**的方法將 activex 物件像果核一樣包裹起來,通過**物件自身的同名屬性和方法提供給外界進行訪問,從而達到跟蹤和攔截的目的。

基於vue和axious的http攔截和路由攔截

乙個專案學會vue全家桶 axios實現登入 攔截 登出功能,以及利用axios的http 攔截請求和響應。該專案是利用了github 提供的personal token作為登入token,通過token訪問你的repository list。通過這個專案學習如何實現乙個前端專案中所需要的 登入及攔...

HTTP 協議的基本知識,包括請求流程 請求方法等

http是hyper text transfer protocol 超文字傳輸協議 的縮寫。它的發展是全球資訊網協會 world wide web consortium 和internet工作小組ietf internet engineering task force 合作的結果,他們 最終發布了一...

http和HTTPS的主要區別

https和http的主要區別 一 https協議需要到ca機構申請ssl證書 如沃通ca 另外沃通ca還提供3年期的免費ssl證書,高階別的ssl證書需要一定費用。二 http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。三 http和https使用的是完全不同...