3

我正在使用 Firefox 的 Addon SDK (v1.9) 构建和扩展。

我的应用程序应该在基于匹配 URI 的数据库添加(或更改)cookie 时删除它们。

我通过向“cookie-changed”添加观察者并实现nsICookie来识别匹配的 cookie 并实现nsICookieManager以在找到匹配时删除 cookie 来完成此任务。

问题

我需要知道每个 cookie 是从哪个网站 (URL) 添加/更改的。

4

1 回答 1

5

不幸的是,当 cookie 管理器发送cookie-changed信息已经丢失的通知时 - cookie 管理器只知道为哪个主机添加了 cookie(如果使用了参数,它可能不是设置 cookie 的页面的主机domain)。甚至可能一开始就没有 URL,例如,如果 cookie 是由扩展设置的。

你可以做的是为http-on-examine-response通知注册一个观察者。您可以查看频道的Set-Cookie标题以及频道 URL,以便cookie-changed稍后发送通知时,您将知道哪个网站负责。像这样的东西:

var observer = require("observer-service");
observer.add("http-on-examine-response", function(subject, data)
{
  subject.QueryInterface(Ci.nsIHttpChannel);
  var cookieNames = [];

  // There can be more than one Set-Cookie header, cannot use getResponseHeader
  subject.visitResponseHeaders(function(header, value)
  {
    if (header.toLowerCase() == "set-cookie")
    {
      var match = /^([^\s=]+)=/.exec(value);
      if (match)
        cookieNames.push(match[1]);
    }
  });

  if (cookieNames.length)
  {
    var url = channel.URI.spec;

    // Remember that this url set the cookies or just clear the header
    if (!isAllowedToSetCookies(url, cookieNames))
      channel.setResponseHeader("Set-Cookie", "", false);
  }
});

注意:此代码未经测试。

文档:观察者通知nsIHttpChannel

于 2012-09-07T07:23:56.763 回答