2015-04-29 27 views

回答

0

不幸的是,目前在webextensions中沒有直接的方法(包括Firefox和Chrome)。讓我們來看看選擇:

  1. 使用fetch,而不是XMLHttpRequest的
  2. 修改請求頭使用webRequest API

選項1具有的魅力,它不涉及黑客,但不足之處是, fetch目前仍缺少XMLHttpRequest中的一些功能。這是否是一個問題,取決於具體的例子。

選項2需要權限才能使用webRequest API,這需要額外的權限。它看起來比它應該更復雜。儘管如此,這是我工作的唯一方式,可以在今天的瀏覽器上使用(2017年11月)。

但讓我們看看兩個選項的細節。

選項1:獲取API和它的侷限性

當你提到在Firefox匿名請求,我敢肯定,你的意思是這樣的代碼:

let xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"] 
      .createInstance(Components.interfaces.nsIXMLHttpRequest); 
xhr.open('GET', 'http://www.example.com'); 
xhr.channel.loadFlags |= Components.interfaces.nsIRequest.LOAD_ANONYMOUS; 
xhr.send(); 

隨着XMLHttpRequest在Chrome中是不可能,但最近你可以得到的是避免使用fetch API發送cookie,它有一個類似的選項credentials,它可以讓你控制是否應該包含cookie('include')或不包括('omit'):

fetch('http://www.example.com', { credentials: 'omit' }).then(...); 

這將在不設置任何cookie的情況下發出GET請求。

XMLHttpRequest相比,功能方面仍然存在一些限制。從我的角度來看,最緊迫的問題是您無法放棄以fetch開始的請求,您也無法控制超時。

支持中止fetch(請參閱AbortController API)有一個新標準,但它目前僅在Firefox 57和Edge(2017年11月)上實現。它很快就會到達Chrome,但是如果您現在需要使用該功能,則可能無法等到所有瀏覽器都支持該功能。

不過,一旦AbortController在那裏,我認爲它會成爲避免發送cookie的首選方式。

選項2:WebRequest的API,並去掉「曲奇」頭手動

如果你需要一個有效的解決方案,現在,你在擴展訪問的WebRequest API的權限,你可以安裝一個onBeforeSendHeaders監聽器並手動刪除Cookie標題。

爲了得到一個想法,這是怎麼可能看起來像:

chrome.webRequest.onBeforeSendHeaders.addListener((details) => { 
    return { 
    requestHeaders: details.requestHeaders.filter(x => x.name.toLowerCase() !== 'cookie'); 
    }; 
}, { urls: ['<all_urls>'] }, ['requestHeaders', 'blocking']); 

但你必須要小心,你不小心修改相關請求。在實際實施中,您應該驗證details.requestId是否匹配。爲了訪問請求ID,我使用了另一個onBeforeRequestListener並驗證請求的URL是否匹配。請求完成後,所有偵聽器都會再次被刪除。 (有關更多詳細信息,請參見How to get the requestId of a new request?。)

從我所看到的情況看,它可行,但它不是一個非常優雅的解決方案。

總結:

取API:

  • (+)直接的解決方案經由crendentials: 'omit'
  • 其旨在
  • (+)的新標準,以取代XMLHttpRequest
  • ( - )電流的瀏覽器還不支持所有功能(超時,取消)

的WebRequest API:

  • (+)適用​​於當今的瀏覽器(Chrome上測試)
  • ( - )對一個簡單的問題非常複雜的解決方案
  • ( - )需要額外的權限來使用它
相關問題