简体   繁体   English

如何检查 cookie 是否存在?

[英]How do I check if a cookie exists?

What's a good way to check if a cookie exist?检查 cookie 是否存在的好方法是什么?

Conditions:状况:

Cookie exists if Cookie 存在如果

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

Cookie doesn't exist if Cookie 不存在,如果

cookie=;
//or
<blank>

You can call the function getCookie with the name of the cookie you want, then check to see if it is = null.您可以使用您想要的 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
    }
}

I have crafted an alternative non-jQuery version:我制作了一个替代的非 jQuery 版本:

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

It only tests for cookie existence.它只测试 cookie 的存在。 A more complicated version can also return cookie value:更复杂的版本也可以返回 cookie 值:

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

Put your cookie name in in place of MyCookie .将您的 cookie 名称替换为MyCookie

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

It will return -1 if that cookie does not exist.如果该 cookie 不存在,它将返回-1

ps Only drawback of it is (as mentioned in comments) that it will mistake if there is cookie set with such name: any_prefix_cookie_name ps 唯一的缺点是(如评论中所述)如果设置了这样的名称的 cookie 会出错: any_prefix_cookie_name

( Source ) 来源

ATTENTION!注意力! the chosen answer contains a bug (Jac's answer) .选择的答案包含一个错误(Jac's answer)

if you have more than one cookie (very likely..) and the cookie you are retrieving is the first on the list, it doesn't set the variable "end" and therefore it will return the entire string of characters following the "cookieName=" within the document.cookie string!如果您有多个 cookie(很可能..)并且您正在检索的 cookie 是列表中的第一个,它不会设置变量“end”,因此它将返回“cookieName”之后的整个字符串=" 在 document.cookie 字符串中!

here is a revised version of that function:这是该功能的修订版:

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

This is an old question, but here's the approach I use ...这是一个老问题,但这是我使用的方法......

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

This returns null either when the cookie doesn't exist, or when it doesn't contain the requested name.当 cookie 不存在或不包含请求的名称时,这将返回null
Otherwise, the value (of the requested name) is returned.否则,返回(请求名称的)值。

A cookie should never exist without a value -- because, in all fairness, what's the point of that?没有值的 cookie 永远不应该存在——因为,平心而论,那有什么意义呢? 😄 😄
If it's no longer needed, it's best to just get rid of it all together.如果不再需要它,最好一起摆脱它。

function deleteCookie(name) {
    document.cookie = name +"=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;";
}

If you're using jQuery, you can use the jquery.cookie plugin .如果您使用 jQuery,则可以使用jquery.cookie 插件

Getting the value for a particular cookie is done as follows:获取特定 cookie 的值按如下方式完成:

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

regexObject.正则对象。 test ( String ) is faster than string. test ( String ) 比 string match ( RegExp ). 匹配(正则表达式)。

The MDN site describes the format for document.cookie, and has an example regex to grab a cookie ( document.cookie.replace(/(?:(?:^|.*;\\s*)test2\\s*\\=\\s*([^;]*).*$)|^.*$/, "$1"); ). MDN 站点描述了 document.cookie 的格式,并有一个示例正则表达式来抓取 cookie ( document.cookie.replace(/(?:(?:^|.*;\\s*)test2\\s*\\=\\s*([^;]*).*$)|^.*$/, "$1"); )。 Based on that, I'd go for this:基于此,我会这样做:

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

The question seems to ask for a solution which returns false when the cookie is set, but empty.该问题似乎要求一种解决方案,该解决方案在设置 cookie 时返回 false,但为空。 In that case:在这种情况下:

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

Tests测试

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

测试结果(Chrome 55.0.2883.87)

There are several good answers here.这里有几个很好的答案。 I however prefer [1] not using a regular expression, and [2] using logic that is simple to read, and [3] to have a short function that [4] does not return true if the name is a substring of another cookie name .但是我更喜欢[1]不使用正则表达式,和[2]使用的逻辑是简单阅读,和[3]具有短函数[4]返回true,如果名字是另一个的cookie的子串姓名 。 Lastly [5] we can't use a for each loop since a return doesn't break it.最后[5]我们不能为每个循环使用 a,因为 return 不会破坏它。

function cookieExists(name) {
  var cks = document.cookie.split(';');
  for(i = 0; i < cks.length; i++)
    if (cks[i].split('=')[0].trim() == name) return true;
}
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;
} 

Tried @jac function, got some trouble, here's how I edited his function.尝试了@jac 函数,遇到了一些麻烦,这是我编辑他的函数的方法。

instead of the cookie variable you would just use document.cookie.split...而不是 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); });

For anyone using Node, I found a nice and simple solution with ES6 imports and the cookie module!对于任何使用 Node 的人,我找到了一个很好且简单的解决方案,其中包含 ES6 导入和cookie模块!

First install the cookie module (and save as a dependency):首先安装cookie模块(并保存为依赖项):

npm install --save cookie

Then import and use:然后导入并使用:

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

Using Javascript:使用 JavaScript:

 function getCookie(name) {
      let matches = document.cookie.match(new RegExp(
        "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
      ));
      return matches ? decodeURIComponent(matches[1]) : undefined;
    }

Note that if a cookie is secure, you cannot check in client side for its existence using document.cookie (which all of the answers are using).请注意,如果 cookie 是安全的,则您无法使用document.cookie (所有答案都在使用)检查客户端是否存在。 Such cookie can be checked only at sever side.此类 cookie 只能在服务器端检查。

Parse cookies with Array.prototype.reduce() into an object (ES6)使用Array.prototype.reduce()将 cookie 解析为对象 (ES6)

const cookies = document.cookie.split(";").reduce((e, t) => {
  const [c, n] = t.trim().split("=").map(decodeURIComponent);
  try { // this can be removed if you do not need JSON cookies parsed
    return Object.assign(e, {
      [c]: JSON.parse(n)
    })
  }
  catch (t) {
    return Object.assign(e, {
      [c]: n
    })
  }
}, {})

Check if your cookie is there检查您的cookie是否在那里

typeof cookies.yourCookie === "string";

If anyone is still looking into this post maybe this will help.如果有人仍在查看这篇文章,也许这会有所帮助。

First do a function to get the cookie, something like this..首先做一个函数来获取cookie,像这样..

function getCookie(cname) {
    let name = cname + "=";
    let ca = document.cookie.split(';');
    for(let i = 0; i < ca.length; i++) {
      let c = ca[i];
      while (c.charAt(0) == ' ') {
        c = c.substring(1);
      }
      if (c.indexOf(name) == 0) {
        return c.substring(name.length, c.length);
      }
    }
    return "";
    
  }

Then you could check if the specific cookie exists before doing something else然后你可以在做其他事情之前检查特定的cookie是否存在

if( getCookie(mycookieName)){
 // do something....
}
// check if cookie is present 
function is_CookiePresent( cookieName ){

  if( void 0 != cookieName && "" != cookieName && null != cookieName ){

    var is_present = document.cookie.split(";").filter(e=>{
        if(e.trim().split("=").includes(cookieName)) return true;
    })

    if(!is_present.length){return false;}
    return true;

  }
  else{
    return false;
  }

}

// Get cookie name value :) 
function getCookieValue( cookieName ){

  if( void 0 != cookieName && "" != cookieName && null != cookieName ){

    var is_present = document.cookie.split(";").filter(e=>{
        if(e.trim().split("=").includes(cookieName)) return true;
    })

    if(!is_present.length){return false;}
   
    var __CookieValue = is_present.join('').trim();

    return __CookieValue.substring(__CookieValue.indexOf('=')+1);

  }
  else{
    return false;
  }

}

use this method instead:请改用此方法:

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

To get a object of cookies simply call getCookie()要获取 cookie 对象,只需调用getCookie()

To check if a cookie exists, do it like this:要检查 cookie 是否存在,请执行以下操作:

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

Or just use a ternary operator.或者只使用三元运算符。

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

Note: The author wanted the function to return false if the cookie is empty ie cookie=;注意:作者希望函数在 cookie 为空时返回 false,即cookie=; this is achieved with the && !!value condition.这是通过&& !!value条件实现的。 Remove it if you consider an empty cookie is still an existing cookie…如果您认为空 cookie 仍然是现有 cookie,请删除它……

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

You can verify if a cookie exists and it has a defined value:您可以验证 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;
}

const COOKIE_EXAMPLE = getCookie('example');
if (COOKIE_EXAMPLE == 'stackoverflow') { ... }
// If is set a cookie named "example" with value "stackoverflow"
if (COOKIE_EXAMPLE != null) { ... }
// If is set a cookie named "example" ignoring the value

It will return null if cookie doesn't exists.如果 cookie 不存在,它将返回 null。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM