繁体   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