Kolačići unutra JavaSkripta: Primjer postavljanja, dobivanja i brisanja

⚡ Pametni sažetak

Kolačići unutra JavaSkripta pohranjuje male parove ključeva i vrijednosti na računalu posjetitelja kako bi HTTP veza bez stanja mogla zapamtiti informacije. Ovaj članak objašnjava kako postaviti, čitati i brisati kolačiće, opisuje svaki atribut kolačića i uspoređuje kolačiće s alternativama za pohranu u pregledniku.

  • 🍪 Osnovna definicija: Kolačić je par ključa i vrijednosti koji preglednik sprema i automatski vraća sa svakim odgovarajućim zahtjevom.
  • ✍️ Pisati Operacija: Dodjeljivanjem document.cookie dodaje se ili zamjenjuje jedan kolačić odjednom i nikada se ne brišu ostali.
  • ???? Čitaj Operacija: Čitanje document.cookie vraća jedan niz odvojen točka-zarezom, tako da se potreban par mora ručno razdvojiti.
  • 🗑️ Izbrisati Operacija: Postavljanje datuma isteka u prošlosti uklanja kolačić, a put i domena moraju odgovarati izvornim vrijednostima.
  • 🔐 Sigurnosni atributi: Secure ograničava prijenos na HTTPS, HttpOnly blokira pristup skriptama, a SameSite kontrolira slanje između web-mjesta.
  • 📏 Ograničenja veličine: Svaki kolačić ima otprilike 4 KB, a preglednici čuvaju oko 50 kolačića po domeni, tako da veliki podaci pripadaju negdje drugdje.
  • 💾 Alternative za pohranu: localStorage i sessionStorage sadrže više podataka i nikada se ne pridružuju mrežnim zahtjevima.

Kolačići unutra JavaScript

Što su kolačići?

Kolačić je dio podataka koji se pohranjuje na vašem računalu kako bi mu vaš preglednik mogao pristupiti. Možda ste i vi svjesno ili nesvjesno uživali u prednostima kolačića. Jeste li ikada ostali prijavljeni na web-mjestu poput Facebooka kako ne biste morali upisivati ​​svoje podatke svaki put kada se pokušate prijaviti? Ako jeste, onda koristite kolačiće. Kolačići se spremaju kao parovi ključ/vrijednost.

Važno pojašnjenje: kolačić ne sadrži vašu lozinku. Sadrži identifikator sesije, što je slučajni token koji poslužitelj izdaje nakon uspješne prijave. Poslužitelj uspoređuje taj token s vašim računom, tako da sama lozinka nikada ne napušta poslužitelj.

Zašto vam je potreban kolačić?

Komunikacija između a web preglednik i poslužitelj se događa korištenjem protokola bez stanja pod nazivom HTTP. Protokol bez stanja tretira svaki zahtjev neovisno. Dakle, poslužitelj ne čuva podatke nakon što ih pošalje pregledniku. Ali u mnogim situacijama podaci će ponovno biti potrebni. Ovdje na scenu stupaju kolačići. S kolačićima, web preglednik neće morati komunicirati s poslužiteljem svaki put kada su podaci potrebni. Umjesto toga, mogu se izravno dohvatiti s računala.

Tipične upotrebe uključuju pamćenje prijavljene sesije, pohranjivanje postavki jezika ili teme, čuvanjeping artikli u trgoviniping košarica između stranica i brojanje posjetitelja koji prvi put dolaze u odnosu na posjetitelje koji se vraćaju.

Javascript Postavite kolačić

Kolačiće možete stvoriti pomoću svojstva document.cookie ovako.

document.cookie = "cookiename=cookievalue"

Možete čak dodati i datum isteka kolačiću tako da će se određeni kolačić ukloniti s računala na navedeni datum. Datum isteka treba biti postavljen u UTC/GMT formatu. Ako ne postavite datum isteka, kolačić će se ukloniti kada korisnik zatvori preglednik.

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

Također možete postaviti domenu i putanju kako biste odredili kojoj domeni i kojim direktorijima u određenoj domeni kolačić pripada. Prema zadanim postavkama, kolačić pripada stranici koja postavlja kolačić.

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

//kreiraj kolačić s domenom trenutne stranice i putanjom koja pokriva cijelu domenu.

⚠️ Upozorenje: Datum isteka mora biti u budućnosti. Datum koji je već prošao upućuje preglednik da odmah izbriše kolačić, što je upravo tehnika koja se koristi u odjeljku za brisanje u nastavku.

JavaSkripta za dobivanje kolačića

Kolačiću možete pristupiti na ovaj način, koji će vratiti sve kolačiće spremljene za trenutnu domenu.

var x =  document.cookie

Vraćena vrijednost je jedan niz znakova u obliku name1=value1; name2=value2Ne postoji ugrađena metoda za čitanje jednog kolačića po imenu, pa se niz mora razdvojiti. Pomoćnik u nastavku vraća jednu vrijednost i prazan niz kada ime nedostaje.

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") === "");

Izlaz:

Ann Smith
true

JavaSkripta Izbriši kolačić

Za brisanje kolačića, samo trebate postaviti vrijednost kolačića na empty (prazno) i vrijednost expires (iskri) na datum koji je već prošao.

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

Jedan detalj uzrokuje većinu neuspjelih brisanja. Preglednik identificira kolačić po njegovom imenu, zajedno s putanjom i domenom, pa naredba za brisanje mora ponoviti isti put i domenu koji su korišteni prilikom stvaranja kolačića.

// 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";

Objašnjenje atributa kolačića

Svaki atribut nakon prve točke-zareza mijenja koliko dugo kolačić traje, koji ga zahtjevi nose i koji ga kod može čitati. Donja referenca pokriva sve njih.

Atribut Svrha Primjer
istječe Apsolutni datum brisanja u UTC formatu ističe=čet, 21. kolovoza 2031. 20:00:00 UTC
maksimalna dob Životni vijek u sekundama od sada max = 2592000 dobi
put Opseg direktorija unutar domene put=/
domena Opseg hosta, uključujući poddomene domena=primjer.com
Osigurati Poslano samo putem HTTPS veze Osigurati
HttpOnly Skriveno od document.cookie, postavlja samo poslužitelj HttpOnly
Isto mjesto Kontrolira slanje zahtjeva s više web-mjesta IstaSite=Lax

SameSite zaslužuje posebnu pozornost jer preglednici sada primjenjuju zadanu vrijednost. Tri prihvaćene vrijednosti ponašaju se na sljedeći način.

  • Strogo: Kolačić se nikada ne šalje kada zahtjev potječe s druge stranice, što je najsigurnije okruženje za bankarske sesije.
  • Laks: Kolačić putuje s navigacijom najviše razine, kao što je klik na poveznicu, ali ne s slikama ili okvirima s više web-mjesta. Ovo je zadana postavka modernog preglednika.
  • Ništa: Kolačić se šalje na svaki zahtjev s više web-mjesta i mora biti uparen s atributom Secure, inače ga preglednik odbija.
// a well configured cookie set from client side script
document.cookie = "language=en; path=/; max-age=31536000; SameSite=Lax; Secure";

💡 Savjet: Atribut HttpOnly ne može se primijeniti iz JavaSkripta, po narudžbi. Samo zaglavlje odgovora poslužitelja može ga postaviti, i to je ono što štiti kolačiće sesije od napada cross-site scriptinga.

Isprobajte ovaj primjer sami

Skripta u nastavku kombinira sve tri operacije. Stvara kolačić s rokom trajanja izmjerenim u danima, čita ga po imenu i pozdravlja ponovnog posjetitelja. Posebne upute za rad koda ... Pritisnite gumb za pokretanje dva puta.

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

Očekivano ponašanje:

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 obrazloženje: Funkcija createCookie pretvara broj dana u milisekunde i dodaje ih trenutnom vremenu, što daje datum isteka. Funkcija accessCookie dijeli niz kolačića na točke-zareze, skraćuje svaki fragment i uspoređuje početak fragmenta s traženim nazivom. Funkcija checkCookie povezuje to dvoje prilikom učitavanja stranice.

⚠️ Upozorenje: Primjer koristi toGMTString(), što je zastarjeli alias. Novi kod bi trebao pozvati toUTCString() umjesto toga, budući da bi zastarjeli oblik s vremenom mogao biti uklonjen iz preglednika.

Kolačići vs. lokalna pohrana vs. pohrana sesije

Kolačići nisu jedino mjesto gdje preglednik može pohranjivati ​​podatke. Postoje dvije opcije web pohrane, a pravilnim odabirom izbjegava se slanje nepotrebnih bajtova na svaki zahtjev.

svojstvo kolačić lokalna pohrana Pohrana sesije
Kapacitet Oko 4 KB Oko 5 MB Oko 5 MB
Poslano na server Da, sa svakim odgovarajućim zahtjevom Ne Ne
Život Do datuma isteka Dok se izričito ne ukloni Dok se kartica ne zatvori
Poslužitelj ga može zapisati Da Ne Ne
Dostupno na više kartica Da Da Ne
Tipična upotreba Sesije i autentifikacija Postavke i predmemorirani podaci Stanje obrasca za jedan posjet

Praktično pravilo je jednostavno. Ako poslužitelj treba vrijednost, koristite kolačić. Ako je potrebna samo stranici, koristite localStorage ili sessionStorage, jer te vrijednosti nikada ne dodaju težinu mrežnom zahtjevu.

Kôd za obradu kolačića obično se dijeli na više stranica, stoga ga pregledajte unutarnje i vanjsko JavaScript prije nego što odlučite gdje ga smjestiti. Razdvajanje nizova koje se ovdje koristi temelji se na JavaNizovi skripte i JavaMetode niza skripti, a daljnji radni skripti pojavljuju se u praktičan JavaPrimjeri skriptnog koda.

Pitanja i odgovori

Otprilike 4 KB po kolačiću, a većina preglednika čuva oko 50 kolačića za svaku domenu. Veće vrijednosti treba smjestiti u lokalnu pohranu ili ih preuzeti s poslužitelja na zahtjev.

Uobičajeni uzroci su prošli datum isteka, neusklađena putanja, stranica otvorena iz datotečnog sustava umjesto s poslužitelja ili preglednik koji blokira kolačiće. Provjerite ploču Aplikacije u alatima za razvojne programere.

Ne. Kolačići tipa HttpOnly namjerno su skriveni od document.cookie kako ubrizgane skripte ne bi mogle ukrasti token sesije. Vidi ih samo poslužitelj, u zaglavljima zahtjeva.

Kolačići prve strane pripadaju domeni u adresnoj traci. Kolačiće treće strane postavlja ugrađena domena poput oglašivača, a preglednici ih sada prema zadanim postavkama ograničavaju ili blokiraju.

Da. Mali kolačić obično pohranjuje identifikator razgovora kako bi widget mogao vratiti nit prilikom sljedećeg posjeta. Same poruke čuvaju se na poslužiteljima pružatelja usluga.

Ne. Kolačići putuju sa svakim odgovarajućim zahtjevom i skripte ih mogu čitati osim ako nije postavljen HttpOnly. Pohranjuju samo neprozirni identifikator i čuvaju osobne podatke na poslužitelju.

Sažmite ovu objavu uz: