簡體   English   中英

如何從Firefox擴展中刪除瀏覽器cookie?

[英]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的問題,但這不是您的代碼所要做的。 您實際上想做什么?

有多個未使用的變量。 我們必須假設這些應該代表什么。 其中包括: datetmpUrlurlusertime 假定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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM