Cookie-uri în JavaScript: Setați, obțineți și ștergeți exemplu

⚡ Rezumat inteligent

Cookie-uri în JavaScripturile stochează perechi mici de chei și valori pe computerul vizitatorului, astfel încât o conexiune HTTP fără stare să poată reține informații. Acest articol explică cum se setează, se citesc și se șterg cookie-urile, descrie fiecare atribut al cookie-urilor și compară cookie-urile cu alternativele de stocare ale browserului.

  • 🍪 Definiția de bază: Un cookie este o pereche cheie-valoare salvată de browser și returnată automat cu fiecare solicitare corespunzătoare.
  • ✍️ Scrie OperaTION: Atribuirea către document.cookie adaugă sau înlocuiește câte un cookie pe rând și nu le șterge niciodată pe celelalte.
  • 📖 Citiți OperaTION: Citirea document.cookie returnează un șir separat prin punct și virgulă, deci perechea necesară trebuie separată manual.
  • 🗑️ Șterge OperaTION: Setarea unei date de expirare în trecut elimină un cookie, iar calea și domeniul trebuie să corespundă cu valorile originale.
  • 🔐 Atribute de securitate: Securitatea restricționează transmiterea la HTTPS, HttpOnly blochează accesul la scripturi, iar SameSite controlează trimiterea între site-uri.
  • 📏 Limite de dimensiune: Fiecare cookie conține aproximativ 4 KB, iar browserele păstrează aproximativ 50 de cookie-uri per domeniu, așadar datele voluminoase aparțin în altă parte.
  • 💾 Alternative de stocare: localStorage și sessionStorage dețin mai multe date și nu sunt niciodată atașate solicitărilor de rețea.

Cookie-uri în JavaScenariu

Ce sunt Cookie-urile?

Un cookie este o porțiune de date stocată pe computerul dvs. pentru a fi accesată de browser. De asemenea, este posibil să fi beneficiat de avantajele cookie-urilor, în mod conștient sau neștiutor. Ați rămas vreodată conectat la un site precum Facebook, astfel încât să nu fie nevoie să introduceți datele dvs. de fiecare dată când încercați să vă conectați? Dacă da, atunci utilizați cookie-uri. Cookie-urile sunt salvate ca perechi cheie/valoare.

O clarificare importantă: un cookie nu vă păstrează parola. Acesta conține un identificator de sesiune, care este un token aleatoriu pe care serverul îl emite după o conectare reușită. Serverul potrivește acel token cu contul dvs., astfel încât parola în sine nu părăsește niciodată serverul.

De ce ai nevoie de un cookie?

Comunicarea dintre a browser web și serverul se întâmplă folosind un protocol fără stare numit HTTP. Un protocol fără stare tratează fiecare solicitare independent. Prin urmare, serverul nu păstrează datele după ce le trimite către browser. Dar, în multe situații, datele vor fi necesare din nou. Aici intervin cookie-urile. Cu cookie-urile, browserul web nu va trebui să comunice cu serverul de fiecare dată când sunt necesare date. În schimb, acestea pot fi preluate direct de pe computer.

Utilizările tipice includ memorarea unei sesiuni de conectare, stocarea unei preferințe de limbă sau temă, păstrarea...ping articole dintr-un magazinping coș de cumpărături între pagini și numărarea vizitatorilor care vizitează pentru prima dată față de cei care revin.

Javascript Setați Cookie

Puteți crea cookie-uri folosind proprietatea document.cookie astfel.

document.cookie = "cookiename=cookievalue"

Puteți chiar adăuga o dată de expirare la cookie-ul dvs., astfel încât cookie-ul respectiv să fie eliminat de pe computer la data specificată. Data de expirare trebuie setată în formatul UTC/GMT. Dacă nu setați data de expirare, cookie-ul va fi eliminat atunci când utilizatorul închide browserul.

document.cookie = "cookiename=cookievalue; expires= Thu, 21 Aug 2031 20:00:00 UTC"

De asemenea, puteți seta domeniul și calea pentru a specifica domeniului și directoarelor din domeniul specific cărora îi aparține cookie-ul. În mod implicit, un cookie aparține paginii care setează cookie-ul.

document.cookie = "cookiename=cookievalue; expires= Thu, 21 Aug 2031 20:00:00 UTC; path=/ "

//creează un cookie cu domeniul paginii curente și o cale care acoperă întregul domeniu.

⚠️ Atenție: Data de expirare trebuie să fie în viitor. O dată care a trecut deja instruiește browserul să șteargă cookie-ul imediat, aceasta fiind exact tehnica utilizată în secțiunea de ștergere de mai jos.

JavaScript Obține cookie

Puteți accesa cookie-ul astfel, care va returna toate cookie-urile salvate pentru domeniul curent.

var x =  document.cookie

Valoarea returnată este un singur șir de caractere de forma name1=value1; name2=value2Nu există o metodă încorporată pentru a citi un cookie după nume, așa că șirul trebuie divizat. Instrumentul auxiliar de mai jos returnează o singură valoare și un șir gol atunci când numele lipsește.

function getCookie(name) {
    const pairs = document.cookie.split(";");
    for (let i = 0; i < pairs.length; i++) {
        const pair = pairs[i].trim();
        if (pair.indexOf(name + "=") === 0) {
            // decode in case the value contained spaces or symbols
            return decodeURIComponent(pair.substring(name.length + 1));
        }
    }
    return "";
}

document.cookie = "username=Ann Smith; path=/";
console.log(getCookie("username"));
console.log(getCookie("missing") === "");

ieșire:

Ann Smith
true

JavaScript Ștergere cookie

Pentru a șterge un cookie, trebuie doar să setați valoarea cookie-ului la empty și să setați valoarea expires la o dată care a trecut deja.

document.cookie = "cookiename= ; expires = Thu, 01 Jan 1970 00:00:00 GMT"

Un detaliu cauzează majoritatea ștergerilor eșuate. Browserul identifică un cookie după numele său, împreună cu calea și domeniul său, astfel încât instrucțiunea de ștergere trebuie să repete aceeași cale și același domeniu care au fost utilizate la crearea cookie-ului.

// created with an explicit path
document.cookie = "theme=dark; path=/; max-age=2592000";

// deletion must repeat that same path
document.cookie = "theme=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT";

// max-age=0 achieves the same result in one shorter line
document.cookie = "theme=; path=/; max-age=0";

Atributele cookie-urilor explicate

Fiecare atribut de după primul punct și virgulă modifică durata de viață a cookie-ului, ce solicitări îl transportă și ce cod îl poate citi. Referința de mai jos le acoperă pe toate.

Atribut Scop Exemplu
expiră Data absolută a ștergerii în format UTC expiră=Joi, 21 august 2031, ora 20:00:00 UTC
varsta maxima Durata de viață în secunde, numărată de acum încolo vârsta maximă = 2592000
cale Domeniul de aplicare al directorului în cadrul domeniului cale=/
domeniu Domeniul de aplicare al gazdei, inclusiv subdomeniile domeniu=exemplu.com
Asigura Trimis doar printr-o conexiune HTTPS Asigura
Numai Http Ascuns de document.cookie, setat doar de server Numai Http
SameSite Controlează trimiterea cererilor între site-uri SameSite=Lax

SameSite merită o atenție deosebită deoarece browserele aplică acum o valoare implicită. Cele trei valori acceptate se comportă după cum urmează.

  • Strict: Cookie-ul nu este niciodată trimis atunci când solicitarea provine de pe un alt site, aceasta fiind cea mai sigură setare pentru sesiunile bancare.
  • Lax: Cookie-ul se deplasează odată cu navigarea de nivel superior, cum ar fi clicul pe un link, dar nu și cu imagini sau cadre pe mai multe site-uri. Aceasta este setarea implicită a browserului modern.
  • Nici unul: Cookie-ul este trimis la fiecare solicitare cross-site și trebuie asociat cu atributul Secure, altfel browserul îl respinge.
// a well configured cookie set from client side script
document.cookie = "language=en; path=/; max-age=31536000; SameSite=Lax; Secure";

💡 Sfat: Atributul HttpOnly nu poate fi aplicat din JavaScript, prin design. Doar un antet de răspuns al serverului îl poate seta, iar asta protejează cookie-urile de sesiune de atacurile de scripting cross-site.

Încercați singur acest exemplu

Scriptul de mai jos combină toate cele trei operații. Creează un cookie cu o expirare măsurată în zile, îl citește după nume și salută un vizitator care revine. Instrucțiuni speciale pentru ca codul să funcționeze… Apăsați butonul de rulare de două ori.

<html>
<head>
	<title>Cookie!!!</title>
	<script type="text/javascript">
		function createCookie(cookieName,cookieValue,daysToExpire)
        {
          var date = new Date();
          date.setTime(date.getTime()+(daysToExpire*24*60*60*1000));
          document.cookie = cookieName + "=" + cookieValue + "; expires=" + date.toGMTString();
        }
		function accessCookie(cookieName)
        {
          var name = cookieName + "=";
          var allCookieArray = document.cookie.split(';');
          for(var i=0; i<allCookieArray.length; i++)
          {
            var temp = allCookieArray[i].trim();
            if (temp.indexOf(name)==0)
            return temp.substring(name.length,temp.length);
       	  }
        	return "";
        }
		function checkCookie()
        {
          var user = accessCookie("testCookie");
          if (user!="")
        	alert("Welcome Back " + user + "!!!");
          else
          {
            user = prompt("Please enter your name");
            num = prompt("How many days you want to store your name on your computer?");
            if (user!="" && user!=null)
            {
            createCookie("testCookie", user, num);
            }
          }
        }
	</script>
</head>
<body onload="checkCookie()"></body>
</html>

Comportament așteptat:

First run  : "Please enter your name"  -> Ann
             "How many days you want to store your name on your computer?" -> 5
Second run : alert box shows  Welcome Back Ann!!!

Code explicaţie: Funcția createCookie convertește un număr de zile în milisecunde și le adaugă la ora curentă, ceea ce produce data de expirare. Funcția accessCookie împarte șirul de caractere al cookie-ului prin punct și virgulă, elimină fiecare fragment și compară începutul fragmentului cu numele solicitat. Funcția checkCookie le leagă pe cele două la încărcarea paginii.

⚠️ Atenție: Exemplul folosește toGMTString(), care este un alias depreciat. Codul nou ar trebui să apeleze toUTCString() în schimb, deoarece formularul perimat ar putea fi în cele din urmă eliminat din browsere.

Cookie-uri vs. stocare locală vs. stocare de sesiune

Cookie-urile nu sunt singurul loc în care un browser poate stoca date. Există două opțiuni de stocare web, iar alegerea corectă evită trimiterea de octeți inutili la fiecare solicitare.

Caracteristică Cookie LocalStorage sesiuneStorage
Capacitate Aproximativ 4 KB Aproximativ 5 MB Aproximativ 5 MB
Trimis către server Da, cu fiecare solicitare potrivită Nu Nu
Toată viața Până la data expirării Până la eliminarea explicită Până când se închide fila
Serverul îl poate scrie Da Nu Nu
Accesibil din toate file-urile Da Da Nu
Utilizare tipică Sesiuni și autentificare Preferințe și date memorate în cache Starea formularului pentru o singură vizită

Regula practică este simplă. Dacă serverul are nevoie de valoare, folosește un cookie. Dacă doar pagina are nevoie de ea, folosește localStorage sau sessionStorage, deoarece aceste valori nu adaugă niciodată greutate unei solicitări de rețea.

Codul de gestionare a cookie-urilor este de obicei partajat pe mai multe pagini, așa că verificați intern si extern JavaScenariu înainte de a decide unde să o plaseze. Împărțirea șirurilor folosită aici se bazează pe JavaȘiruri de script și JavaMetode de tip matrice de script, iar alte scripturi de lucru apar în practic JavaExemple de cod de script.

Întrebări frecvente

Aproximativ 4 KB per cookie, iar majoritatea browserelor păstrează aproximativ 50 de cookie-uri pentru fiecare domeniu. Valorile mai mari ar trebui plasate în localStorage sau preluate de pe server la cerere.

Cauzele frecvente sunt o dată de expirare depășită, o cale nepotrivită, o pagină deschisă din sistemul de fișiere în loc de pe server sau blocarea cookie-urilor de către browser. Verificați panoul Aplicație din instrumentele pentru dezvoltatori.

Nu. Cookie-urile HttpOnly sunt ascunse în mod deliberat de document.cookie, astfel încât scripturile injectate să nu poată fura un token de sesiune. Doar serverul le vede, în anteturile cererii.

Cookie-urile primare aparțin domeniului din bara de adrese. Cookie-urile terțe sunt setate de un domeniu încorporat, cum ar fi un agent de publicitate, iar browserele le restricționează sau le blochează acum în mod implicit.

Da. Un cookie de mici dimensiuni stochează de obicei un identificator de conversație, astfel încât widgetul să poată restaura firul de discuție la următoarea vizită. Mesajele în sine sunt păstrate pe serverele furnizorului.

Nu. Cookie-urile sunt trimise la fiecare solicitare care corespunde cerințelor și pot fi citite de scripturi, cu excepția cazului în care este setat HttpOnly. Stochează doar un identificator opac și păstrează datele personale pe server.

Rezumați această postare cu: