按名称阅读javascript cookie

时间:2011-02-28 13:03:45

标签: javascript cookies

我使用

设置了一个cookie
document.cookie = 
    'MYBIGCOOKIE=' + value + 
    '; expires=' + now.toGMTString() + 
    '; path=/';

现在这个网站上设置了5到10个cookie,有没有办法按名称检查这个cookie的值。

if (document.cookie.MYBIGCOOKIE == '1') {
    alert('it is 1')
}

12 个答案:

答案 0 :(得分:20)

使用RegExp构造函数和多个替换来阐明语法:

function getCook(cookiename) 
  {
  // Get name followed by anything except a semicolon
  var cookiestring=RegExp(""+cookiename+"[^;]+").exec(document.cookie);
  // Return everything after the equal sign, or an empty string if the cookie name not found
  return decodeURIComponent(!!cookiestring ? cookiestring.toString().replace(/^[^=]+./,"") : "");
  }

//Sample usage
var cookieValue = getCook('MYBIGCOOKIE');

答案 1 :(得分:14)

不幸的是,Javascript的cookie语法远没有那么好。事实上,在我看来,它是设计最差的部分之一。

当您尝试阅读document.cookie时,您会收到一个包含所有Cookie集的字符串。您必须解析字符串,用分号;字符分隔。网络上有很多版本,而不是自己编写。我最喜欢的是the one at quirksmode.org。这会为您提供createCookiereadCookiedeleteCookie个功能。

答案 2 :(得分:11)

function getCookie(c_name)
{
    var i,x,y,ARRcookies=document.cookie.split(";");

    for (i=0;i<ARRcookies.length;i++)
    {
        x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
        y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
        x=x.replace(/^\s+|\s+$/g,"");
        if (x==c_name)
        {
            return unescape(y);
        }
     }
}

来源:W3Schools

修改:如@ zcrar70所述,上述代码为 不正确 ,请参阅以下答案Javascript getCookie functions

答案 3 :(得分:3)

使用jquery-cookie

我觉得这个图书馆很有帮助。 3.128 kb的纯粹便利。

添加脚本

<script src="/path/to/jquery.cookie.js"></script>

设置Cookie

$.cookie('name', 'value');

读取cookie

$.cookie('name');

答案 4 :(得分:2)

Stack Overflow的目的是提供一个高质量答案的数据库,所以我将引用一些标准源代码和一篇提供示例的文章:

http://www.codelib.net/javascript/cookies.html

注意:代码是正则表达式,可大大提高效率。

使用提供的源代码,您可以使用以下cookie:

makeCookie('color', 'silver');

这会保存一个cookie,表明颜色是银色。 cookie将在当前会话之后到期(一旦用户退出浏览器)。

makeCookie('color', 'green', { domain: 'gardens.home.com' });

这会为gardens.home.com保存绿色。

makeCookie('color', 'white', { domain: '.home.com', path: '/invoices' });
makeCookie('invoiceno', '0259876', { path: '/invoices', secure: true });

为在home.com任意位置查看的发票保存白色。第二个cookie是安全cookie,并记录发票号。此cookie将仅发送到通过安全HTTPS连接查看的页面,安全页面中的脚本是允许访问cookie的唯一脚本。

不允许一个HTTP主机存储或读取另一个HTTP主机的cookie。因此,cookie域必须至少存储两个句点。默认情况下,域与创建cookie的Web地址的域相同。

HTTP cookie的路径将其限制为HTTP主机上的某些文件。某些浏览器使用默认路径/,因此cookie将在整个主机上可用。其他浏览器使用整个文件名。在这种情况下,如果/invoices/overdue.cgi创建了Cookie,则只有/invoices/overdue.cgi才能恢复Cookie。

设置路径和其他参数时,它们通常基于从location.href等变量获取的数据。这些字符串已经被转义,因此在创建cookie时,cookie函数不会再次转义这些值。只转义cookie的名称和值,因此我们可以方便地使用任意名称或值。某些浏览器会限制Cookie的总大小,或允许一个域保留的Cookie总数。

makeCookie('rememberemail', 'yes', { expires: 7 });
makeCookie('rememberlogin', 'yes', { expires: 1 });
makeCookie('allowentergrades', 'yes', { expires: 1/24 });

这些cookie将记住用户的电子邮件7天,用户登录1天,并允许用户在没有密码的情况下输入1小时(一天的第24天)的成绩。即使他们退出浏览器,即使他们没有退出浏览器,也会遵守这些时间限制。用户可以自由使用其他浏览器程序,也可以删除cookie。如果他们这样做,无论到期日期如何,cookie都将无效。

makeCookie('rememberlogin', 'yes', { expires: -1 });

删除cookie。 cookie值是多余的,返回值false表示删除成功。 (使用-1的到期而不是0.如果我们使用0,则cookie可能会被取消删除,直到超过当前时间一秒。在这种情况下,我们会认为删除不成功。)

显然,由于cookie可以通过这种方式删除,因此新的cookie也会覆盖具有相同名称的旧cookie的任何值,包括到期日期等。但是,完全不重叠的路径的cookie或者域是分开存储的,相同的名称不会相互干扰。但一般来说,任何有权访问cookie的路径或域都可以覆盖cookie,无论它是否改变了新cookie的路径或域。

rmCookie('rememberlogin');

还会通过makeCookie('rememberlogin', '', { expires: -1 })删除Cookie。这使得cookie代码更长,但为使用它的人保存代码,从长远来看,人们可能认为可以节省更多代码。

答案 5 :(得分:2)

document.cookie="MYBIGCOOKIE=1";

您的Cookie看起来像:

"MYBIGCOOKIE=1; PHPSESSID=d76f00dvgrtea8f917f50db8c31cce9"

首先阅读所有cookies:

var read_cookies = document.cookie;

然后用“;”

分割所有Cookie
var split_read_cookie = read_cookies.split(";");

然后使用for循环读取每个值。进入循环,每个值再次用“=”

分割
for (i=0;i<split_read_cookie.length;i++){
    var value=split_read_cookie[i];
    value=value.split("=");
    if(value[0]=="MYBIGCOOKIE" && value[1]=="1"){
        alert('it is 1');
    }
}

答案 6 :(得分:2)

最简单的方法之一是,但如前所述,如果有类似名称(MyCookie vs AnotherMyCookie),它可以返回错误的cookie:

var regex = /MyCookie=(.[^;]*)/ig;
var match = regex.exec(document.cookie);
var value = match[1];

我在Chrome扩展程序中使用它,所以我知道我设置的名称, 我可以确保不会或多或少地重复。

答案 7 :(得分:1)

这是一个API,用于平滑令人讨厌的浏览器cookie“API”

http://code.google.com/p/cookies/

答案 8 :(得分:1)

您可以使用以下功能:

var cookies = getCookiesMap(document.cookie);
var cookieValue = cookies["MYBIGCOOKIE"];

当使用 document.cookie 作为参数调用时,它将返回一个对象,其中cookie键作为键和cookie值。

aptitude[]

答案 9 :(得分:0)

这里是一个示例实现,它将使该过程变得无缝(从AngularJs借来)

var CookieReader = (function(){
var lastCookies = {};
var lastCookieString = '';

function safeGetCookie() {
    try {
        return document.cookie || '';
    } catch (e) {
        return '';
    }
}

function safeDecodeURIComponent(str) {
    try {
        return decodeURIComponent(str);
    } catch (e) {
        return str;
    }
}

function isUndefined(value) {
    return typeof value === 'undefined';
}

return function () {
    var cookieArray, cookie, i, index, name;
    var currentCookieString = safeGetCookie();

    if (currentCookieString !== lastCookieString) {
        lastCookieString = currentCookieString;
        cookieArray = lastCookieString.split('; ');
        lastCookies = {};

        for (i = 0; i < cookieArray.length; i++) {
            cookie = cookieArray[i];
            index = cookie.indexOf('=');
            if (index > 0) { //ignore nameless cookies
                name = safeDecodeURIComponent(cookie.substring(0, index));

                if (isUndefined(lastCookies[name])) {
                    lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1));
                }
            }
        }
    }
    return lastCookies;
};
})();

答案 10 :(得分:0)

我认为可以读取Cookie的最简单方法是使用Regexp,如下所示:

**将COOKIE_NAME替换为您的cookie名称。

document.cookie.match(/COOKIE_NAME=([^;]*);/)[1]

它如何工作?

Cookie像这样存储在document.cookie中:cookieName=cookieValue;cookieName2=cookieValue2;.....

正则表达式会在整个cookie字符串中搜索字面量"COOKIE_NAME="并捕获其后不是分号的所有内容,直到它真正找到分号为止;

然后,我们使用[1]从数组中获取第二个项目,即捕获的组。

答案 11 :(得分:0)

我用它来读取 cookie:

function getCookie (key) {
  let value = ''
  document.cookie.split(';').forEach((e)=>{
     if(e.includes(key)) {
        value = e.split('=')[1]
     }
  })
return value
}

let name = getCookie(name)