Bir çerez olup olmadığını nasıl kontrol ederim?


84

Bir çerez olup olmadığını kontrol etmenin iyi bir yolu nedir?

Koşullar:

Çerez varsa

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

Çerez mevcut değilse

cookie=;
//or
<blank>

Yanıtlar:


127

İstediğiniz tanımlama bilgisinin adıyla getCookie işlevini çağırabilir, ardından = null olup olmadığını kontrol edebilirsiniz.

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

3
Kullanımdan unescapekaldırıldığından, decodeURIComponentbunun yerine kullanımında herhangi bir fark var mı?
the_nuts

3
@the_nuts, Güzel yakalayış. Bunu bilmiyordum. W3cschools'a göre decodeURI () veya decodeURIComponent unescape'i değiştirmek için kullanılabilir. Hangisinin kullanılacağının seçimi depolanmakta olana inebilir, decodeURI'yi seçtim çünkü tanımlama bilgisinde kodlanmış ayırıcı karakterler olmasını beklemiyorum. Tam referans: w3schools.com/jsref/jsref_decodeuri.asp
jac

3
bu, ilk tanımlama
bilgisiyle çalışmaz

function doSomething ($ isim) {var myCookie = getCookie ($ isim);
Sol

1
Bu, w3schools'un neden güvenilir bir kaynak olmadığına ve ondan yanıtları neden kopyalayıp yapıştırmamanız gerektiğine dair mükemmel bir örnektir. Js'de oldukça iyi bilinen == ve! = Kullanmaktan kaçınırdınız.
Isaac Pak

96

Alternatif bir jQuery olmayan sürüm oluşturdum:

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

Yalnızca çerez varlığını test eder. Daha karmaşık bir sürüm de çerez değeri döndürebilir:

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

Yerine çerez adınızı girin MyCookie.


14
harika temiz çözüm! İnsanlar bu günlerde eklentileri çok hızlı alıyor ... çok fazla ek yük. Bu çok güzel bir çözüm!
patrick

3
Bu çalışmıyor. Normal ifadede boşluk eksik. Document.cookie.match (/ renew(.*;)? MyCookie = [^;] + (. *)? $ /) Olmalı, sonra boşluğa dikkat edin?.
Bogdan M.

1
document.cookie, boşluklarla ayrılmış çerezleri döndürür, yani: cookie1 =; çerez1 = 345534;
Bogdan M.

1
@BogdanM. : İlk çerez için boş alan yok! / [] {0,1} / Yukarıdaki
Gabriel

6
Bir değişken kullanmak istiyorsanız: new RegExp ("^ (?:. *;)? \\ s *" + çerezAdı + "\\ s * = \\ s * ([^;] +) (?:. *)? $ ")
josef

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

Bu -1çerez yoksa geri dönecektir .

ps Sadece dezavantajı (yorumlarda belirtildiği gibi), böyle bir isimde bir çerez seti varsa hata yapabilmesidir: any_prefix_cookie_name

( Kaynak )


5
Bu, aynı zamanda, adlarındaki dizeyle tüm çerezleri de eşleştirir. Dışındaki Ör örnek döner bir şey -1varsa cookie_name_whateverayarlanır (COOKIE_name olmasa bile). Başka bir cevaptaki normal ifade versiyonu bunu çözer.
hajamie

4
% 100 doğru olmasa da, bu çoğu durumda yeterince iyi bir çözümdür. Bunun için teşekkürler - Bunu kullanırken büyük bir işlevden veya diğer çözümlerden karmaşık regexp'ten çok daha rahat hissediyorum.
Shane N

15

DİKKAT! seçilen cevap bir hata içeriyor (Jac'ın cevabı).

Birden fazla çereziniz varsa (büyük olasılıkla ..) ve aldığınız çerez listede birinci ise, "son" değişkenini ayarlamaz ve bu nedenle "çerezAdı" nı izleyen tüm karakter dizisini döndürür. = "document.cookie dizesi içinde!

işte bu işlevin gözden geçirilmiş bir sürümü:

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

Yalnızca bir çerez setiyle, işleviniz "cookieName =" döndürdü. : - /
Jeppe

1
@Jeppe Kodu yalnızca bir çerez olduğunda çalışacak şekilde değiştirdim. Aslında tüm işlevi yeniden düzenleme ve düzenleme şansını buldum ve bazı yorumlar ekledim. ;)
Pikkio

Değiştir (/ "/ g, '') ile ilgili bir sorun var; bana sözdizimi hatası veriyor
iKamy

benim için çalıştı ama muhtemelen normal ifadedeki alıntılardan kaçmak daha iyidir. Cevabı düzenledim. Şimdi sizin için de çalışmalı!
Pikkio

6

JQuery kullanıyorsanız, jquery.cookie eklentisini kullanabilirsiniz .

Belirli bir çerezin değerini almak şu şekilde yapılır:

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

3
Bu aynı zamanda OP'nin jquery-cookie eklentisini kullandığını varsayar. Jquery kullandığımdan beri beni biraz döngüye soktu, ancak çözdüğüm görev için bu eklentiyi kullanamıyorum.
hippeelee

8
bu sadece
jquery'ye

4

regexObject. test (String) dizeden daha hızlıdır . eşleşme (RegExp).

MDN sitesi document.cookie formatını açıklar ve (çerez kapmak için örnek bir normal ifade vardır document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");). Buna dayanarak, bunun için giderdim:

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

Soru, çerez ayarlandığında ancak boş olduğunda yanlış döndüren bir çözüm istiyor gibi görünüyor. Bu durumda:

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

Testler

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 sonuçları (Chrome 55.0.2883.87)


cookieName'i string olarak geçirmek yerine bir değişkeni cookieName olarak nasıl geçirebilirim?
DILEEP THOMAS

var adı = 'çerez1'; yeni RegExp ('^ (. *;)? \\ s *' + ad + '\\ s * ='). test (document.cookie);
hajamie

4

Bu eski bir soru, ama işte benim kullandığım yaklaşım ...

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

Bu null, çerez mevcut olmadığında veya istenen adı içermediğinde geri döner .
Aksi takdirde, (istenen adın) değeri döndürülür.

Bir çerez asla bir değeri olmadan var olmamalıdır - çünkü, doğrusu, bunun anlamı nedir? 😄
Artık gerekli değilse, en iyisi hepsinden kurtulmaktır.

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

Değersiz bir tanımlama bilgisine sahip olmanın, yani bir şeyin varlığına işaret etmenin tamamen geçerli bir nedeni vardır. Bir Boolean gibi kullanılır: çerez var => doğru, çerez yok => yanlış
Gus

2
Bu listedeki en iyi yöntemdi.
Andrew

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 işlevini denedim, biraz sorun yaşadım, işte işlevini nasıl düzenledim.


1

çerez değişkeni yerine sadece document.cookie.split kullanırsınız ...

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


1

Node'u kullanan herkes için, ES6 ithalatı ve cookiemodülü ile güzel ve basit bir çözüm buldum !

Önce çerez modülünü kurun (ve bağımlılık olarak kaydedin):

npm install --save cookie

Ardından içe aktarın ve kullanın:

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

1

Javascript kullanarak:

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

0

bunun yerine bu yöntemi kullanın:

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

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

0

Burada birkaç iyi cevap var. Ben ancak tercih [1] normal bir ifade kullanarak değil, [2] okumak için basit mantık kullanarak ve [3] Bu kısa işlevi olması [4] gelmez değil adının başka çerez bir alt dize ise doğru döndürür isim. Son olarak [5] her döngü için a kullanamayız çünkü bir dönüş onu bozmaz.

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

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

Bir çerez nesnesi almak için şu numarayı aramanız yeterlidir: getCookie()

Bir çerez olup olmadığını kontrol etmek için şunu yapın:

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

Veya sadece üçlü bir operatör kullanın.


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

Not: Yazar, tanımlama bilgisi boşsa işlevin yanlış döndürmesini istemiştir, yani cookie=;bu && !!valuekoşulla sağlanır . Boş bir çerezin hala mevcut bir çerez olduğunu düşünüyorsanız onu kaldırın ...


0

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


Merhaba ve SO'ya hoş geldiniz! Bu kod soruyu yanıtlayabilirken, sorunun nasıl ve / veya neden çözüldüğüne ilişkin ek bağlam sağlamak, yanıtlayanın uzun vadeli değerini artıracaktır. Lütfen turu okuyun ve nasıl iyi bir cevap yazabilirim?
Tomer Shetah

0

Bir çerez güvenliyse, kullanarak document.cookie(tüm cevapların kullandığı) müşteri tarafında varlığını kontrol edemeyeceğinizi unutmayın . Bu tür çerezler yalnızca sunucu tarafında kontrol edilebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.