web-dev-qa-db-fra.com

Lire un cookie javascript par son nom

J'ai créé un cookie avec

document.cookie = 
    'MYBIGCOOKIE=' + value + 
    '; expires=' + now.toGMTString() + 
    '; path=/';

Ce site contient actuellement entre 5 et 10 cookies. Existe-t-il un moyen de vérifier la valeur de ce cookie par son nom?.

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

Utilisez le constructeur RegExp et plusieurs remplacements pour clarifier la syntaxe:

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');
19
Paul Sweatte

Malheureusement, la syntaxe des cookies de Javascript est loin d'être aussi agréable que ça. En fait, à mon avis, c'est l'une des pires pièces conçues.

Lorsque vous essayez de lire document.cookie, vous obtenez une chaîne contenant tous les cookies configurés. Vous devez analyser la chaîne en la séparant par le point virgule ;. Plutôt que d’écrire cela vous-même, de nombreuses versions sont disponibles sur le Web. Mon préféré est celui de quirksmode.org . Cela vous donne les fonctions createCookie, readCookie et deleteCookie.

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

Source: W3Schools

Edit: comme @ zcrar70 l'a noté, le code ci-dessus est incorrect, veuillez consulter la réponse suivante Javascript getCookie fonctions

11
usoban

en utilisant jquery-cookie

Je trouve cette bibliothèque utile. 3,128 ko de pure commodité.

ajouter un script

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

mettre cookie

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

lire le cookie

$.cookie('name');
3
rahulroy9202

Stack Overflow a pour objectif de fournir une base de données de réponses de bonne qualité. Je vais donc faire référence à du code source standard et à un article qui donne des exemples:

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

Remarque: le code ne contient pas d'expression régulière pour une efficacité grandement améliorée.

En utilisant le code source fourni, vous utiliseriez des cookies comme ceci:

makeCookie('color', 'silver');

Cela enregistre un cookie indiquant que la couleur est argentée. Le cookie expirerait après la session en cours (dès que l'utilisateur quitte le navigateur).

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

Cela enregistre la couleur verte pour gardens.home.com.

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

enregistre la couleur blanche pour les factures consultées n’importe où sur home.com. Le deuxième cookie est un cookie sécurisé qui enregistre un numéro de facture. Ce cookie sera envoyé uniquement aux pages visualisées via des connexions HTTPS sécurisées, et les scripts des pages sécurisées sont les seuls scripts autorisés à accéder au cookie.

Un hôte HTTP n'est pas autorisé à stocker ou à lire les cookies pour un autre hôte HTTP. Ainsi, un domaine de cookie doit être stocké avec au moins deux périodes. Par défaut, le domaine est identique à celui de l'adresse Web qui a créé le cookie.

Le chemin d'un cookie HTTP le limite à certains fichiers sur l'hôte HTTP. Certains navigateurs utilisent un chemin par défaut de /, de sorte que le cookie sera disponible sur tout l'hôte. Les autres navigateurs utilisent le nom de fichier complet. Dans ce cas, si /invoices/overdue.cgi crée un cookie, seul /invoices/overdue.cgi récupérera le cookie.

Lors de la définition des chemins et autres paramètres, ils sont généralement basés sur des données obtenues à partir de variables telles que location.href, etc. Ces chaînes sont déjà échappées. Ainsi, lorsque le cookie est créé, la fonction cookie n'échappe plus à ces valeurs. Seuls le nom et la valeur du cookie sont protégés, nous pouvons donc utiliser des noms ou des valeurs arbitraires. Certains navigateurs limitent la taille totale d'un cookie ou le nombre total de cookies qu'un domaine est autorisé à conserver.

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

ces cookies mémoriseraient le courrier électronique de l'utilisateur pendant 7 jours, le nom de connexion de l'utilisateur pendant 1 jour, et permettraient à l'utilisateur de saisir des notes sans mot de passe pendant 1 heure (un quart de jour). Ces délais sont respectés même s’ils quittent le navigateur et même s’ils ne le quittent pas. Les utilisateurs sont libres d'utiliser un autre programme de navigation ou de supprimer les cookies. S'ils le font, les cookies n'auront aucun effet, quelle que soit leur date d'expiration.

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

supprime le cookie. La valeur du cookie est superflue et la valeur de retour false signifie que la suppression a été effectuée avec succès. (Une expiration de -1 est utilisée au lieu de 0. Si nous avions utilisé 0, le cookie pourrait ne pas être supprimé jusqu'à une seconde après l'heure actuelle. Dans ce cas, nous penserions que la suppression a échoué.)

De toute évidence, puisqu'un cookie peut être supprimé de cette manière, un nouveau cookie écrase également toute valeur d'un ancien cookie qui porte le même nom, y compris la date d'expiration, etc. Cependant, les cookies pour des domaines ou des chemins totalement superposés sont stockés. séparément, et les mêmes noms ne se gênent pas. Mais en général, tout chemin ou domaine ayant accès à un cookie peut remplacer le cookie, qu'il modifie ou non le chemin ou le domaine du nouveau cookie.

rmCookie('rememberlogin');

supprime également le cookie en faisant makeCookie('rememberlogin', '', { expires: -1 }). Cela rallonge le code de cookie, mais enregistre le code pour les personnes qui l'utilisent, ce qui pourrait laisser penser qu'il enregistre davantage de code à long terme.

2
Joseph Myers
document.cookie="MYBIGCOOKIE=1";

Vos cookies ressembleraient à:

"MYBIGCOOKIE=1; PHPSESSID=d76f00dvgrtea8f917f50db8c31cce9"

tout d'abord lire tous les cookies:

var read_cookies = document.cookie;

puis divisez tous les cookies avec ";" :

var split_read_cookie = read_cookies.split(";");

puis utilisez boucle pour lire chaque valeur. En boucle, chaque valeur est à nouveau divisée avec "=" :

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

Un des moyens les plus courts est le suivant. Cependant, comme mentionné précédemment, il peut renvoyer le mauvais cookie s’il existe des noms similaires (MyCookie vs AnotherMyCookie):

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

J'utilise ceci dans une extension chrome pour que je connaisse le nom que je donne, .__ et je peux m'assurer qu'il n'y aura pas de duplicata, plus ou moins.

2
Escape75

Voici une API qui a été écrite pour lisser le cookie de navigateur méchant "API" 

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

1
JAAulde

Vous pouvez utiliser la fonction suivante:

function getCookiesMap(cookiesString) {
  return cookiesString.split(";")
    .map(function(cookieString) {
        return cookieString.trim().split("=");
    })
    .reduce(function(acc, curr) {
        acc[curr[0]] = curr[1];
        return acc;
    }, {});
}

Lorsque, appelé avec le paramètre document.cookie , il renvoie un objet, avec les clés de cookies comme clés et les valeurs des cookies.

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

Voici un exemple de mise en œuvre qui rendrait ce processus sans couture

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;
};
})();
0
craftsmannadeem