如何从firefox扩展中删除浏览器cookie?

时间:2014-09-15 19:48:19

标签: javascript firefox cookies

从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);
        }
    }

代码正在运行。在给定的间隔时间之后,用户会被淘汰。但是当用户点击同一个网址后,它会转到401页面。 我是firefox扩展开发人员的新手。所以请帮助我。

1 个答案:

答案 0 :(得分:0)

MDN refs:

您的问题要求删除Cookie,但这不是您的代码所做的。你究竟想做什么?

有多个未定义的变量。我们必须假设这些应该代表什么。其中包括:datetmpUrlurlusertime。假设tmpUrl实际上是域名url = "http://" + tmpUrl;

问题1 :expi定义为Date。你正在使用它应该是文本的地方。您应该准确指定要表示日期的格式。这需要与Firefox期望在此日期看到的格式相匹配。自动转换为文本时使用的格式与为cookie指定的格式不同。但是,鉴于Firefox正在转换它可能正常工作的所有日期。

问题2 :您似乎混淆了单个Cookie与整个Cookie字符串的概念。您正在清除域的所有cookie并将其替换为单个cookie,这是您在明确定义的到期时间内遇到的第一个cookie。如果知道此域中只有一个Cookie,则可能在您的环境中正常。

如果要设置整个cookie字符串,则需要从该域中的每个cookie构建它。它应该只在完成后设置(循环后)。

或者,您可以使用nsICookieManager2并单独处理每个Cookie。然后你将读取一个,然后添加()它(尽管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的到期时间)。由于需要cookie.isHttpOnly,还必须使用nsICookie2界面而不是nsICookie1

我已删除用于测试的代码,如果您需要,我可以将其重新添加。

以下是您的代码要执行的操作(将域的所有Cookie更改为具有特定的到期时间):

Components.utils.import( “资源://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);
}
相关问题