3

我正在开发一个 Firefox 附加组件,该附加组件将允许用户(所有这些用户都是特定组的一部分;此附加组件的受众范围非常有限)从状态栏中查看其身份验证 cookie 的状态。我们都必须进行身份验证才能访问与工作相关的网站,但是当 cookie 过期时我们不会收到任何警告,因此这会导致工作流程中烦人甚至有时是剧烈的中断。最终,这个附加组件将允许我们从状态栏中提交我们的凭据,而无需进行任何重新加载或重定向,但现在,我只想看到它显示状态。

我一直在 nsICookie、nsICookie2、nsICookieManager 等上查看 Mozilla 开发人员页面,但并不清楚其中任何一个如何适合 JavaScript 或 XUL 或其他任何东西。

理想情况下,我只想让 JavaScript 走出文档并获取我指定的域的 cookie 字符串。如果我能做到这一点,它将允许代码可能被移植到其他浏览器(特别是 Safari 和 Chrome)。但是,如果这必须是特定于浏览器的,那么我至少想知道在没有任何设置或删除的花里胡哨的情况下检查 cookie 是否存在于 Firefox 中的方法。

简单地说,我想用一种方式说:

 if (cookieExists("sample.com", CookieName)) {
     alert("You're signed in!");
 } else {
     alert('Go sign in, you fool!');
 }

这样做的最简单/最便携的方法是什么(当然是浏览器端)?

4

3 回答 3

5

我一直在查看 nsICookie、nsICookie2、nsICookieManager 等的 Mozilla 开发人员页面,但并不清楚它如何适合 javascript 或 XUL 或其他任何东西。

可以从 Firefox 扩展访问所有 cookie,并使用 nsICookieManager 和 nsICookie 接口。从您的扩展程序中的 javascript 代码,您可以访问 cookie 管理器

var cookieManager = Components.classes["@mozilla.org/cookiemanager;1"].getService(Components.interfaces.nsICookieManager);

并且您可以遍历所有存储的 cookie

var enum = cookieManager.enumerator;
while (enum.hasMoreElements()){
   var cookie = enum.getNext();
   if (cookie instanceof Components.interfaces.nsICookie){
      // commands
   }
}

现在,当引用 cookie 对象时,您可以检查其属性

cookie.host
cookie.name
cookie.value
...

nsICookie接口中定义。此代码是 Firefox 特定的,可以作为浏览器扩展或签名脚本运行。希望我的解释有点帮助。

下面我介绍一些在扩展中使用 JS XPCOM 接口的链接:

  1. JS XPCOM
  2. 使用 cookie
于 2009-05-10T12:03:19.997 回答
4

您可以使用 jquery 插件进行 cookie 处理

http://www.stilbuero.de/2006/09/17/cookie-plugin-for-jquery/

或者简单地通过javascript: http ://www.quirksmode.org/js/cookies.html

于 2009-05-10T05:05:13.270 回答
1

这是在 javascript 中使用 cookie的一个很好的教程。使用该教程中的函数,您可能可以执行以下操作:

if readCookie(yourCookieName != "") {
      alert("You're signed in!");
 else {
      alert("Go sign in, you fool!");
}

以下是cookie函数:

function readCookie(name) {
  var ca = document.cookie.split(';');
  var nameEQ = name + "=";
  for(var i=0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1, c.length); //delete spaces
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
  return "";
}

function createCookie(name, value, days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
    }
  else var expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
}

function eraseCookie(name) {
  createCookie(name, "", -1);
}
于 2009-05-10T05:05:29.777 回答