【问题标题】:Accessing cookies, hopefully in JavaScript访问 cookie,希望在 JavaScript 中
【发布时间】:2017-05-06 23:19:42
【问题描述】:

我正在开发一个 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!');
 }

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

【问题讨论】:

标签: javascript cookies xul add-on


【解决方案1】:

我一直在查看 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 特定的,可以作为浏览器扩展程序或 signed script 运行。希望我的解释有点帮助。

下面我提供一些关于在扩展中使用 JS XPCOM 接口的链接:

  1. JS XPCOM
  2. Using cookies

【讨论】:

    【解决方案2】:

    你可以使用 jquery 插件来处理 cookie

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

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

    【讨论】:

    • 尽管如此,我还是没有看到要获取另一个域的 cookie。但进一步阅读表明,出于安全原因,这是不可能的。
    • 这是正确的,您不能访问当前域之外的 cookie。
    【解决方案3】:

    这里有一个很好的 working with cookies in javascript 教程。使用该教程中的函数,您可能可以执行以下操作:

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

    【讨论】:

      猜你喜欢
      • 2011-09-18
      • 1970-01-01
      • 2011-08-07
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多