Kakor i JavaSkript: Set, Get & Delete Exempel

⚡ Smart sammanfattning

Kakor i JavaSkript lagrar små nyckel- och värdepar på besökarens dator så att en tillståndslös HTTP-anslutning kan komma ihåg information. Den här artikeln förklarar hur man ställer in, läser och tar bort cookies, beskriver varje cookieattribut och jämför cookies med alternativ för webbläsarlagring.

  • 🠪 Kärndefinition: En cookie är ett nyckel- och värdepar som sparas av webbläsaren och returneras automatiskt vid varje matchande begäran.
  • ✍️ Skriva Operation: Att tilldela till document.cookie lägger till eller ersätter en cookie i taget och raderar aldrig de andra.
  • ???? Läsa Operation: Läsning av document.cookie returnerar en semikolonseparerad sträng, så det obligatoriska paret måste delas ut manuellt.
  • 🗑️ Radera Operation: Om du anger ett utgångsdatum i det förflutna tas en cookie bort, och sökvägen och domänen måste matcha de ursprungliga värdena.
  • 🔐 Säkerhetsattribut: Säker begränsar överföring till HTTPS, HttpOnly blockerar skriptåtkomst och SameSite styr sändning mellan webbplatser.
  • 📏 Storleksgränser: Varje cookie rymmer ungefär 4 KB och webbläsare lagrar cirka 50 cookies per domän, så stora mängder data hör hemma någon annanstans.
  • 💾 Lagringsalternativ: localStorage och sessionStorage lagrar mer data och är aldrig kopplade till nätverksförfrågningar.

Kakor i JavaScript

Vad är cookies?

En cookie är en datafil som lagras på din dator för att din webbläsare ska kunna komma åt den. Du kanske också har utnyttjat fördelarna med cookies, medvetet eller omedvetet. Har du någonsin varit inloggad på en webbplats som Facebook så att du inte behöver skriva in dina uppgifter varje gång du försöker logga in? Om ja, då använder du cookies. Cookies sparas som nyckel/värde-par.

Ett viktigt förtydligande: en cookie lagrar inte ditt lösenord. Den innehåller en sessionsidentifierare, vilket är en slumpmässig token som servern utfärdar efter en lyckad inloggning. Servern matchar den token med ditt konto, så lösenordet lämnar aldrig servern.

Varför behöver du en kaka?

Kommunikationen mellan en webbläsare och servern sker med hjälp av ett tillståndslöst protokoll som heter HTTP. Ett tillståndslöst protokoll behandlar varje begäran oberoende. Så servern lagrar inte data efter att ha skickat den till webbläsaren. Men i många situationer kommer data att behövas igen. Här kommer cookies in i bilden. Med cookies behöver webbläsaren inte kommunicera med servern varje gång data behövs. Istället kan de hämtas direkt från datorn.

Typiska användningsområden inkluderar att komma ihåg en inloggad session, lagra språk- eller temainställningar,ping varor i en butikping varukorg mellan sidor och räkna förstagångsbesökare kontra återkommande besökare.

Javascript Ställ in Cookie

Du kan skapa cookies med hjälp av egenskapen document.cookie så här.

document.cookie = "cookiename=cookievalue"

Du kan till och med lägga till ett utgångsdatum till din cookie så att den specifika cookien tas bort från datorn på det angivna datumet. Utgångsdatumet bör anges i UTC/GMT-format. Om du inte anger något utgångsdatum kommer cookien att tas bort när användaren stänger webbläsaren.

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

Du kan också ange domän och sökväg för att ange vilken domän och vilka kataloger i den specifika domänen cookien tillhör. Som standard tillhör en cookie den sida som placerar cookien.

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

//skapa en cookie med en domän för den aktuella sidan och en sökväg som täcker hela domänen.

⚠️ Varning: Utgångsdatumet måste vara i framtiden. Ett datum som redan har passerat instruerar webbläsaren att omedelbart radera cookien, vilket är exakt den teknik som används i borttagningsavsnittet nedan.

JavaSkript Hämta cookie

Du kan komma åt cookien så här, vilken returnerar alla cookies som sparats för den aktuella domänen.

var x =  document.cookie

Det returnerade värdet är en enda sträng i formen name1=value1; name2=value2Det finns ingen inbyggd metod för att läsa en cookie efter namn, så strängen måste delas. Hjälparen nedan returnerar ett enda värde och en tom sträng när namnet saknas.

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

Produktion:

Ann Smith
true

JavaSkript Ta bort Cookie

För att radera en cookie behöver du bara ställa in cookiens värde till tomt och värdet för expires till ett datum som redan har passerat.

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

En detalj orsakar de flesta misslyckade borttagningar. Webbläsaren identifierar en cookie med dess namn tillsammans med dess sökväg och domän, så borttagningskommandot måste upprepa samma sökväg och domän som användes när cookien skapades.

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

Förklaring av cookieattribut

Varje attribut efter det första semikolonet ändrar hur länge cookien lever, vilka förfrågningar som bär den och vilken kod som får läsa den. Referensen nedan täcker alla dessa.

Attribut Syfte Exempelvis
löper ut Absolut raderingsdatum i UTC-format upphör att gälla=tors, 21 aug 2031 20:00:00 UTC
max-ålder Livslängd i sekunder räknat från och med nu max ålder = 2592000
bana Katalogens omfattning inom domänen sökväg =/
domän Värdomfattning, inklusive underdomäner domän=example.com
Säkra Skickas endast via en HTTPS-anslutning Säkra
Httponly Dold från document.cookie, endast inställd av servern Httponly
SameSite Kontrollerar sändning av begäranden mellan olika webbplatser SameSite=Lax

SameSite förtjänar särskild uppmärksamhet eftersom webbläsare nu använder en standardvärde. De tre accepterade värdena beter sig enligt följande.

  • Sträng: Cookien skickas aldrig när begäran kommer från en annan webbplats, vilket är den säkraste inställningen för banksessioner.
  • Slapp: Cookien följer med navigering på toppnivå, till exempel genom att klicka på en länk, men inte med bilder eller ramar som går över flera webbplatser. Detta är standardinställningen för moderna webbläsare.
  • Inga: Cookien skickas vid varje begäran mellan olika webbplatser och måste paras ihop med attributet Secure, annars avvisar webbläsaren den.
// a well configured cookie set from client side script
document.cookie = "language=en; path=/; max-age=31536000; SameSite=Lax; Secure";

💡 Tips: Attributet HttpOnly kan inte tillämpas från JavaSkript, avsiktligt. Endast en serversvarsrubrik kan ställa in det, och det är det som skyddar sessionscookies från skriptattacker över flera webbplatser.

Prova det här exemplet själv

Skriptet nedan kombinerar alla tre operationerna. Det skapar en cookie med ett utgångsdatum mätt i dagar, läser upp den med namn och hälsar en återkommande besökare välkommen. Särskilda instruktioner för att få koden att fungera … Tryck två gånger på körknappen.

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

Förväntat beteende:

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 förklaring: Funktionen createCookie konverterar ett antal dagar till millisekunder och lägger till dem till den aktuella tiden, vilket ger utgångsdatumet. Funktionen accessCookie delar upp cookiesträngen med semikolon, trimmar varje fragment och jämför början av fragmentet med det begärda namnet. Funktionen checkCookie knyter ihop de två vid sidans inläsning.

⚠️ Varning: Exemplet använder toGMTString(), vilket är ett föråldrat alias. Ny kod ska anropa toUTCString() istället, eftersom det föråldrade formuläret så småningom kan tas bort från webbläsare.

Cookies kontra lokal lagring kontra sessionslagring

Cookies är inte den enda platsen där en webbläsare kan lagra data. Det finns två alternativ för webblagring, och om du väljer rätt sätt undviker du att skicka onödiga byte vid varje begäran.

Leverans Cookies lokalt utrymme sessionStorage
Kapacitet Cirka 4 kB Cirka 5 MB Cirka 5 MB
Skickat till servern Ja, med varje matchande förfrågan Nej Nej
Livslängd Fram till utgångsdatumet Tills uttryckligen borttagen Tills fliken stängs
Servern kan skriva det Ja Nej Nej
Tillgänglig via alla flikar Ja Ja Nej
Typisk användning Sessioner och autentisering Inställningar och cachade data Tillstånd för formulär för engångsbesök

Den praktiska regeln är enkel. Om servern behöver värdet, använd en cookie. Om bara sidan behöver det, använd localStorage eller sessionStorage, eftersom dessa värden aldrig lägger till vikt till en nätverksförfrågan.

Kod för hantering av cookies delas vanligtvis över många sidor, så granska internt och externt JavaScript innan man bestämmer var den ska placeras. Strängdelningen som används här bygger på JavaSkriptsträngar och JavaSkriptmatrismetoder, och ytterligare arbetsskript visas i praktisk JavaExempel på skriptkod.

Vanliga frågor

Ungefär 4 KB per cookie, och de flesta webbläsare lagrar cirka 50 cookies för varje domän. Större värden bör placeras i localStorage eller hämtas från servern på begäran.

Vanliga orsaker är ett försenat utgångsdatum, en felaktig sökväg, en sida som öppnats från filsystemet istället för en server, eller att webbläsaren blockerar cookies. Kontrollera programpanelen i utvecklarverktygen.

Nej. HttpOnly-cookies är avsiktligt dolda från document.cookie så att injicerade skript inte kan stjäla en sessionstoken. Endast servern ser dem, i förfrågningshuvudena.

Förstapartscookies tillhör domänen i adressfältet. Tredjepartscookies ställs in av en inbäddad domän, till exempel en annonsör, och webbläsare begränsar eller blockerar dem nu som standard.

Ja. En liten cookie lagrar vanligtvis en konversationsidentifierare så att widgeten kan återställa tråden vid nästa besök. Meddelandena själva lagras på leverantörens servrar.

Nej. Cookies följer med varje matchande begäran och kan läsas av skript om inte HttpOnly är inställt. Lagra endast en ogenomskinlig identifierare och behåll personuppgifter på servern.

Sammanfatta detta inlägg med: