[英]How to remove browser cookies from firefox extension?
從fire fox擴展中刪除瀏覽器cookie的最佳方法是什么? 我使用以下代碼:
var date = new Date ();
var expi = new Date(date.getTime() + usertime*60000); // how long to stay login
var cookieMgr = Components.classes["@mozilla.org/cookiemanager;1"]
.getService(Components.interfaces.nsICookieManager);
for (var e = cookieMgr.enumerator; e.hasMoreElements();)
{
var cookie = e.getNext().QueryInterface(Components.interfaces.nsICookie);
if(cookie.host == tmpUrl) // for check is the current page
{
var cookieString = '"'+cookie.name+"="+cookie.value+";domain="+tmpUrl+";expires="+expi+'"';
var cookieUri = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService)
.newURI(url, null, null);
Components.classes["@mozilla.org/cookieService;1"]
.getService(Components.interfaces.nsICookieService)
.setCookieString(cookieUri, null, cookieString, null);
}
}
該代碼正在運行。 給定間隔時間后,用戶將注銷。 但是注銷后,當用戶單擊相同的URL時,它將轉到401頁。 我是firefox擴展開發人員的新手。 所以請幫幫我。
MDN參考:
您的問題詢問有關刪除cookie的問題,但這不是您的代碼所要做的。 您實際上想做什么?
有多個未使用的變量。 我們必須假設這些應該代表什么。 其中包括: date
, tmpUrl
, url
和usertime
。 假定tmpUrl
實際上是域,並且url = "http://" + tmpUrl;
問題1 :expi被定義為Date
。 您在應該是文本的地方使用它。 您應該准確指定要用來表示日期的格式。 這需要與Firefox預期在該日期看到的格式相匹配。 自動轉換為文本時使用的格式與為cookie指定的格式不同。 但是,鑒於Firefox正在轉換所有日期,因此它也許可以正常工作。
問題2 :您似乎對單個cookie的概念與整個cookie字符串的概念感到困惑。 您要清除該域的所有cookie,並用單個cookie替換它們,這是您遇到的第一個具有明確定義的到期時間的cookie。 如果你知道只有一個此域的cookie,這可能是在您的環境確定。
如果要設置整個cookie字符串,則需要從該域中的每個cookie構建它。 僅應在完成后(循環之后)進行設置。
或者,您可以使用nsICookieManager2並分別處理每個cookie。 然后,您將讀一個,然后對其進行add()(盡管add()方法被聲明為后門之類)。
無論哪種方式,您當前都在通過刪除除第一個cookie之外的任何cookie並通過從cookie中刪除潛在的其他信息(例如cookie.path等)來丟失信息。
問題3 :在FF32.0.1中進行的測試表明,cookie字符串接口未達到預期的功能,至少在getCookieString()范圍內。 該函數在某些情況下返回字符串,在其他情況下返回null。 返回字符串時,它僅包含名稱=值對,而沒有任何到期信息,路徑等。測試表明nsICookieManager2接口正常運行(包括驗證信息是否存儲在SQLite cookie數據庫中)。
注意1 :此外,考慮到cookie.host的格式(即,它的第一個字符可以帶有“。”),最好使用正則表達式將域與cookie.host匹配,除非您確定您知道是否多余的“。” 在您要處理的確切域中。 (循環之外):
var domain = "yourdomain.com";
var domainRegex = new RegExp( "\.?" + domain + "$", "i");
(在循環):
domainRegex.lastIndex = 0; // Clear the Regex.
if(domainRegex.test(cookie.host)) { // check for the current page
鑒於nsICookieService接口存在的問題,我的偏好是改為使用nsICookieManager2接口。 這也允許一次處理每個cookie。 以下代碼應執行您的代碼似乎試圖完成的操作(設置域中所有cookie的到期時間)。 也有必要使用nsICookie2接口而不是nsICookie1由於需要cookie.isHttpOnly。
我已經刪除了用於測試的代碼,如果需要的話,我可以將其重新添加。
以下內容將執行您的代碼打算執行的操作(將域的所有cookie更改為具有特定的到期時間):
Components.utils.import(“ resource://gre/modules/Services.jsm”); var cookieMgr2 = Services.cookies;
var domain = "zzzzzzzzzzzzzzzzzzzz.com";
var usertime = 600;
var domainRegex = new RegExp( "\.?" + domain + "$", "i");
var expi = new Date(Date.now() + usertime*60000); // how long to stay login
for (var e = cookieMgr2.getCookiesFromHost(domain); e.hasMoreElements();) { //Get an enumerator which only gives hosts that are close to what we want.
var cookie = e.getNext().QueryInterface(Components.interfaces.nsICookie2);;
domainRegex.lastIndex = 0; // Clear the Regex.
if(domainRegex.test(cookie.host)) { // check for current page
//This next line makes the change you appear to desire to each cookie in the domain.
cookieMgr2.add(domain, cookie.path ,cookie.name,cookie.value, cookie.isSecure, cookie.isHttpOnly, false, expi.getTime()); //Make non-session and set exiration time.
}
}
如果您要刪除Cookie,則應執行以下操作:
if(domainRegex.test(cookie.host)) { // check for the current page
cookieMgr2.remove(cookie.host,cookie.name,cookie.path, false);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.