如果cookie存在,请检查cookie

时间:2011-05-11 17:28:27

标签: javascript html cookies

检查cookie是否存在的好方法是什么?

条件:

Cookie存在,如果

cookie1=;cookie1=345534;
//or
cookie1=345534;cookie1=;
//or
cookie1=345534;

如果

,则Cookie不存在
cookie=;
//or
<blank>

20 个答案:

答案 0 :(得分:99)

您可以使用所需的cookie名称调用函数getCookie,然后检查它是否为null。

function getCookie(name) {
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    }
    else
    {
        begin += 2;
        var end = document.cookie.indexOf(";", begin);
        if (end == -1) {
        end = dc.length;
        }
    }
    // because unescape has been deprecated, replaced with decodeURI
    //return unescape(dc.substring(begin + prefix.length, end));
    return decodeURI(dc.substring(begin + prefix.length, end));
} 

function doSomething() {
    var myCookie = getCookie("MyCookie");

    if (myCookie == null) {
        // do cookie doesn't exist stuff;
    }
    else {
        // do cookie exists stuff
    }
}

答案 1 :(得分:64)

我制作了一个替代的非jQuery版本:

document.cookie.match(/^(.*;)?\s*MyCookie\s*=\s*[^;]+(.*)?$/)

它只测试cookie的存在。更复杂的版本也可以返回cookie值:

value_or_null = (document.cookie.match(/^(?:.*;)?\s*MyCookie\s*=\s*([^;]+)(?:.*)?$/)||[,null])[1]

将您的Cookie名称替换为MyCookie

答案 2 :(得分:20)

document.cookie.indexOf('cookie_name=');

如果该cookie不存在,它将返回-1

P.S。唯一的缺点是(如评论中所述),如果存在具有此类名称的cookie,则会出错:any_prefix_cookie_name

Source

答案 3 :(得分:8)

注意! 所选答案包含一个错误(Jac的回答)。

如果您有多个cookie(非常可能......)并且您正在检索的cookie是列表中的第一个,它不会将变量设置为“end”,因此它将返回以下整个字符串document.cookie string中的“cookieName =”!

这是该功能的修订版本:

function getCookie( name ) {
    var dc,
        prefix,
        begin,
        end;

    dc = document.cookie;
    prefix = name + "=";
    begin = dc.indexOf("; " + prefix);
    end = dc.length; // default to end of the string

    // found, and not in first position
    if (begin !== -1) {
        // exclude the "; "
        begin += 2;
    } else {
        //see if cookie is in first position
        begin = dc.indexOf(prefix);
        // not found at all or found as a portion of another cookie name
        if (begin === -1 || begin !== 0 ) return null;
    } 

    // if we find a ";" somewhere after the prefix position then "end" is that position,
    // otherwise it defaults to the end of the string
    if (dc.indexOf(";", begin) !== -1) {
        end = dc.indexOf(";", begin);
    }

    return decodeURI(dc.substring(begin + prefix.length, end) ).replace(/\"/g, ''); 
}

答案 4 :(得分:6)

如果您使用的是jQuery,则可以使用jquery.cookie plugin

获取特定cookie的值如下:

$.cookie('MyCookie'); // Returns the cookie value

答案 5 :(得分:3)

regexObject。test(String)是faster而不是字符串。match(RegExp)。

MDN site描述了document.cookie的格式,并有一个示例正则表达式来获取cookie(document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");)。基于此,我会这样做:

/^(.*;)?\s*cookie1\s*=/.test(document.cookie);

问题似乎是要求一个解决方案,在设置cookie时返回false,但是为空。在那种情况下:

/^(.*;)?\s*cookie1\s*=\s*[^;]/.test(document.cookie);

<强>测试

function cookieExists(input) {return /^(.*;)?\s*cookie1\s*=/.test(input);}
function cookieExistsAndNotBlank(input) {return /^(.*;)?\s*cookie1\s*=\s*[^;]/.test(input);}
var testCases = ['cookie1=;cookie1=345534;', 'cookie1=345534;cookie1=;', 'cookie1=345534;', ' cookie1 = 345534; ', 'cookie1=;', 'cookie123=345534;', 'cookie=345534;', ''];
console.table(testCases.map(function(s){return {'Test String': s, 'cookieExists': cookieExists(s), 'cookieExistsAndNotBlank': cookieExistsAndNotBlank(s)}}));

Test results (Chrome 55.0.2883.87)

答案 6 :(得分:1)

function getCookie(name) {

    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
        else{
            var oneCookie = dc.indexOf(';', begin);
            if(oneCookie == -1){
                var end = dc.length;
            }else{
                var end = oneCookie;
            }
            return dc.substring(begin, end).replace(prefix,'');
        } 

    }
    else
    {
        begin += 2;
        var end = document.cookie.indexOf(";", begin);
        if (end == -1) {
            end = dc.length;
        }
        var fixed = dc.substring(begin, end).replace(prefix,'');
    }
    // return decodeURI(dc.substring(begin + prefix.length, end));
    return fixed;
} 

尝试了@jac功能,遇到了一些麻烦,这是我编辑他的功能的方法。

答案 7 :(得分:1)

请注意,如果 cookie 是安全的,则您无法使用 document.cookie(所有答案都在使用)检查客户端是否存在。此类cookie只能在服务器端检查。

答案 8 :(得分:1)

这是一个古老的问题,但这是我使用的方法...

X-Forwarded-Proto

当cookie不存在或不包含所请求的名称时,它将返回X-Forarded-For
否则,将返回(所请求名称的)值。

没有值的cookie永远不应该存在-因为公平地说,这有什么意义?
如果不再需要,最好将它们全部消除。

function getCookie(name) {
    var match = document.cookie.match(RegExp('(?:^|;\\s*)' + name + '=([^;]*)')); return match ? match[1] : null;
}

答案 9 :(得分:1)

使用JavaScript:

branchArray := strings.Split(branchString, "/")
branchArray = []string{branchArray[0], strings.Join(branchArray[1:], "/")}

remote = branchArray[0]
branchname = branchArray[1]

答案 10 :(得分:0)

改为使用此方法:

function getCookie(name) {
    var value = "; " + document.cookie;
    var parts = value.split("; " + name + "=");
    if (parts.length == 2) return parts.pop().split(";").shift();
    else return null;
}

function doSomething() {
    var myCookie = getCookie("MyCookie");

    if (myCookie == null) {
        // do cookie doesn't exist stuff;
    }
    else {
        // do cookie exists stuff
    }
}

答案 11 :(得分:0)

function hasCookie(cookieName){
return document.cookie.split(';')
.map(entry => entry.split('='))
.some(([name, value]) => (name.trim() === cookieName) && !!value);
}

注意:作者希望该函数在cookie为空的情况下返回false,即cookie=;是通过&& !!value条件实现的。如果您认为空Cookie仍然是现有Cookie,请将其删除...

答案 12 :(得分:0)

这里有几个很好的答案。但是,我更喜欢 [1] 不使用正则表达式,而 [2] 使用易于理解的逻辑,以及 [3] 具有简短功能,如果名称是另一个Cookie名称的子字符串,则 [4] 不会返回true。最后, [5] 我们不能为每个循环使用a,因为返回不会破坏它。

new_query1

答案 13 :(得分:0)

function getcookie(name = '') {
    let cookies = document.cookie;
    let cookiestore = {};
    
    cookies = cookies.split(";");
    
    if (cookies[0] == "" && cookies[0][0] == undefined) {
        return undefined;
    }
    
    cookies.forEach(function(cookie) {
        cookie = cookie.split(/=(.+)/);
        if (cookie[0].substr(0, 1) == ' ') {
            cookie[0] = cookie[0].substr(1);
        }
        cookiestore[cookie[0]] = cookie[1];
    });
    
    return (name !== '' ? cookiestore[name] : cookiestore);
}

要获取Cookie对象,只需调用getCookie()

要检查cookie是否存在,请执行以下操作:

if (!getcookie('myCookie')) {
    console.log('myCookie does not exist.');
} else {
    console.log('myCookie value is ' + getcookie('myCookie'));
}

或者只使用三元运算符。

答案 14 :(得分:0)

/// ************************************************ cookie_exists

/// global entry point, export to global namespace

/// <synopsis>
///   cookie_exists ( name );
///
/// <summary>
///   determines if a cookie with name exists
///
/// <param name="name">
///   string containing the name of the cookie to test for 
//    existence
///
/// <returns>
///   true, if the cookie exists; otherwise, false
///
/// <example>
///   if ( cookie_exists ( name ) );
///     {
///     // do something with the existing cookie
///     }
///   else
///     {
///     // cookies does not exist, do something else 
///     }

function cookie_exists ( name )
  {
  var exists = false;

  if ( document.cookie )
    {
    if ( document.cookie.length > 0 )
      {
                                    // trim name
      if ( ( name = name.replace ( /^\s*/, "" ).length > 0 ) )
        {
        var cookies = document.cookie.split ( ";" );
        var name_with_equal = name + "=";

        for ( var i = 0; ( i < cookies.length ); i++ )
          {
                                    // trim cookie
          var cookie = cookies [ i ].replace ( /^\s*/, "" );

          if ( cookie.indexOf ( name_with_equal ) === 0 )
            {
            exists = true;
            break;
            }
          }
        }
      }
    }

  return ( exists );

  } // cookie_exists

答案 15 :(得分:0)

对于使用Node的任何人,我发现了一个使用ES6导入和cookie模块的简单明了的解决方案!

首先安装cookie模块(并保存为依赖项):

npm install --save cookie

然后导入并使用:

import cookie from 'cookie';
let parsed = cookie.parse(document.cookie);
if('cookie1' in parsed) 
    console.log(parsed.cookie1);

答案 16 :(得分:0)

而不是cookie变量,您只需使用document.cookie.split ...

var cookie = 'cookie1=s; cookie1=; cookie2=test';
var cookies = cookie.split('; ');
cookies.forEach(function(c){
  if(c.match(/cookie1=.+/))
   console.log(true);
});

答案 17 :(得分:-1)

var cookie = 'cookie1=s; cookie1=; cookie2=test';
var cookies = cookie.split('; ');
cookies.forEach(function(c){
  if(c.match(/cookie1=.+/))
   console.log(true);
});

答案 18 :(得分:-1)

您可以验证 cookie 是否存在以及它是否具有定义的值:

function getCookie(cookiename) {
    if (typeof(cookiename) == "string" && cookiename != "") {
        const cookies = document.cookie.split(";");
        for (i = 0; i < cookies.length; i++) {
            if (cookies[i].trim().startsWith(cookiename)) {
                return cookies[i].split("=")[1];
            }
        }
    }
    return null;
}

如果cookie不存在则返回null。

答案 19 :(得分:-2)

如果您只是检查是否存在cookie,为什么不...

if(isset($ _ COOKIE ['mycookie'])){在这里做东西}