JavaScript og informasjonskapsler
Denne artikkelen forklarer JavaScript og informasjonskapsler.
Vi vil nøye forklare alt steg for steg, fra det grunnleggende om informasjonskapsler, lesing og skriving, sikkerhet, til praktiske eksempler.
YouTube Video
javascript-cookie.html
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <title>JavaScript & HTML</title>
6 <style>
7 * {
8 box-sizing: border-box;
9 }
10
11 body {
12 margin: 0;
13 padding: 1em;
14 padding-bottom: 10em;
15 font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
16 background-color: #f7f9fc;
17 color: #333;
18 line-height: 1.6;
19 }
20
21 .container {
22 max-width: 800px;
23 margin: 0 auto;
24 padding: 1em;
25 background-color: #ffffff;
26 border: 1px solid #ccc;
27 border-radius: 10px;
28 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
29 }
30
31 .container-flex {
32 display: flex;
33 flex-wrap: wrap;
34 gap: 2em;
35 max-width: 1000px;
36 margin: 0 auto;
37 padding: 1em;
38 background-color: #ffffff;
39 border: 1px solid #ccc;
40 border-radius: 10px;
41 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
42 }
43
44 .left-column, .right-column {
45 flex: 1 1 200px;
46 min-width: 200px;
47 }
48
49 h1, h2 {
50 font-size: 1.2rem;
51 color: #007bff;
52 margin-top: 0.5em;
53 margin-bottom: 0.5em;
54 border-left: 5px solid #007bff;
55 padding-left: 0.6em;
56 background-color: #e9f2ff;
57 }
58
59 button {
60 display: block;
61 margin: 1em auto;
62 padding: 0.75em 1.5em;
63 font-size: 1rem;
64 background-color: #007bff;
65 color: white;
66 border: none;
67 border-radius: 6px;
68 cursor: pointer;
69 transition: background-color 0.3s ease;
70 }
71
72 button:hover {
73 background-color: #0056b3;
74 }
75
76 #output {
77 margin-top: 1em;
78 background-color: #1e1e1e;
79 color: #0f0;
80 padding: 1em;
81 border-radius: 8px;
82 min-height: 200px;
83 font-family: Consolas, monospace;
84 font-size: 0.95rem;
85 overflow-y: auto;
86 white-space: pre-wrap;
87 }
88
89 .highlight {
90 outline: 3px solid #ffc107; /* yellow border */
91 background-color: #fff8e1; /* soft yellow background */
92 transition: background-color 0.3s ease, outline 0.3s ease;
93 }
94
95 .active {
96 background-color: #28a745; /* green background */
97 color: #fff;
98 box-shadow: 0 0 10px rgba(40, 167, 69, 0.5);
99 transition: background-color 0.3s ease, box-shadow 0.3s ease;
100 }
101 </style>
102</head>
103<body>
104 <div class="container">
105 <h1>JavaScript Console</h1>
106 <button id="executeBtn">Execute</button>
107 <div id="output"></div>
108 </div>
109
110 <script>
111 // Override console.log to display messages in the #output element
112 (function () {
113 // Override console.log
114 const originalLog = console.log;
115 console.log = function (...args) {
116 originalLog.apply(console, args);
117 const message = document.createElement('div');
118 message.textContent = args.map(String).join(' ');
119 output.appendChild(message);
120 };
121
122 // Override console.error
123 const originalError = console.error;
124 console.error = function (...args) {
125 originalError.apply(console, args);
126 const message = document.createElement('div');
127 message.textContent = args.map(String).join(' ');
128 message.style.color = 'red'; // Color error messages red
129 output.appendChild(message);
130 };
131 })();
132
133 document.getElementById('executeBtn').addEventListener('click', () => {
134 // Prevent multiple loads
135 if (document.getElementById('externalScript')) return;
136
137 const script = document.createElement('script');
138 script.src = 'javascript-cookie.js';
139 script.id = 'externalScript';
140 //script.onload = () => console.log('javascript-cookie.js loaded and executed.');
141 //script.onerror = () => console.log('Failed to load javascript-cookie.js.');
142 document.body.appendChild(script);
143 });
144 </script>
145</body>
146</html>
JavaScript og informasjonskapsler
Informasjonskapsel
refererer til små datastykker lagret i brukerens nettleser. De brukes hovedsakelig til følgende formål:.
- Brukergodkjenning (opprettholde innloggingsstatus)
- Lagre brukerinnstillinger (språk, tema, etc.)
- Sporing (nettleserhistorikk, etc.)
I JavaScript kan du lese og skrive informasjonskapsler ved å bruke document.cookie
.
Opprette (skrive) informasjonskapsler
Informasjonskapsler opprettes med følgende syntaks:.
1document.cookie = "username=JohnDoe";
- Denne koden lagrer en informasjonskapsel kalt
"username=JohnDoe"
i nettleseren.
Opprette informasjonskapsler med utløpsdato
Informasjonskapsler kan ha en angitt utløpsdato. Hvis ingen utløpsdato er satt, behandles det som en øktinformasjonskapsel og slettes når nettleseren lukkes.
1const date = new Date();
2date.setTime(date.getTime() + (7 * 24 * 60 * 60 * 1000)); // 7 days
3const cookieText = "username=JohnDoe; expires=" + date.toUTCString() + "; path=/; SameSite=None; Secure"
4document.cookie = cookieText;
5console.log(`Cookie Text : ${cookieText}`);
6console.log(`Cookie Value : ${document.cookie}`);
- Attributtet
expires
angir informasjonskapselens utløpsdato i UTC-format. - Attributtet
path
angir stien der informasjonskapselen vil bli sendt./
betyr hele nettstedet. - Hvis du angir
SameSite=None
, vilCookie
en bli sendt selv ved forespørsler på tvers av nettsteder. Men i dette tilfellet må du alltid inkludereSecure
-attributtet. - Å angi
Secure
begrenserCookie
en til kun HTTPS-kommunikasjon, noe som øker sikkerheten. - Ved å referere til
document.cookie
, kan du hente ut alleCookie
ene som er tilgjengelige på siden som en streng. - Ved å bruke
console.log
, kan du kontrollere forskjellen mellom de faktiskeCookie
-verdiene som er satt i nettleseren og de verdiene som kan hentes ut.
Hente (lese) informasjonskapsler
Du kan hente alle informasjonskapsler som en streng med document.cookie
.
1const date = new Date();
2date.setTime(date.getTime() + (7 * 24 * 60 * 60 * 1000)); // 7 days
3document.cookie = "theme=dark; expires=" + date.toUTCString() + "; path=/; SameSite=None; Secure"
4
5console.log(document.cookie);
6// Output: "username=JohnDoe; theme=dark"
- Returverdien til
document.cookie
er en enkelt streng der alleCookie
ene settes sammen i formatet 'key=value;
'. - Det er praktisk å bruke en funksjon for å analysere denne strengen og hente ut ønsket verdi.
Funksjon for å hente verdien til en informasjonskapsel
1function getCookie(name) {
2 const cookies = document.cookie.split('; ');
3 for (const cookie of cookies) {
4 const [key, value] = cookie.split('=');
5 if (key === name) {
6 return decodeURIComponent(value);
7 }
8 }
9 return null;
10}
11
12console.log(getCookie("username")); // "JohnDoe"
- Denne funksjonen deler opp nøkler og verdier ved hjelp av
split()
og returnerer verdien hvis den samsvarer med den angitte nøkkelen. - Ved å bruke
decodeURIComponent
, kan du hente ut kodede tegn på riktig måte. - Hvis den tilsvarende nøkkelen ikke finnes, returneres
null
.
Slette informasjonskapsler
En informasjonskapsel kan slettes ved å sette dens utløpsdato til en dato i fortiden.
1document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; SameSite=None; Secure";
2
3console.log(document.cookie);
4// Output: "theme=dark"
- Ved å tildele en tom verdi til
username
og sette utløpsdatoen til tidligere, vil den slettes. - Når du sletter en
Cookie
, må du også matchepath
,SameSite
ogSecure
-attributtene med de som ble brukt da den ble opprettet. - I dette eksempelet slettes
username
, mens andreCookie
er somtheme=dark
forblir.
Alternativer for informasjonskapsler
Du kan angi ulike alternativer for å kontrollere oppførselen til en informasjonskapsel. De viktigste er som følger:.
Angir informasjonskapselens utløpsdato i UTC-format. Hvis ikke angitt, blir informasjonskapselen en øktinformasjonskapsel og slettes når nettleseren lukkes.
Angir informasjonskapselens utløpsdato i sekunder. Dette har forrang over `expires`.
Angir stien hvor informasjonskapselen vil bli sendt. For eksempel, hvis du angir `/admin`, vil informasjonskapselen kun bli sendt til sider under denne stien.
Angir domenet hvor informasjonskapselen er gyldig. Vanligvis er det satt for det nåværende domenet, men du kan bruke det for alle underdomener, for eksempel `.example.com`.
Når dette attributtet er angitt, sendes informasjonskapselen kun via HTTPS. For økt sikkerhet, bør du alltid angi dette attributtet for sensitiv informasjon.
Kontrollerer om informasjonskapsler sendes ved forespørsler mellom nettsteder. Du kan angi en av følgende tre verdier:.
- `Strict`
Informasjonskapsler sendes kun ved forespørsler fra samme nettsted.
- `Lax`
Informasjonskapsler sendes ved vanlig navigering, men med noen begrensninger.
- `None`
Informasjonskapsler kan sendes selv ved forespørsler mellom nettsteder. Imidlertid kreves også attributtet `Secure`.
Eksempel: Sikker informasjonskapsel
1document.cookie = "sessionId=abc123; secure; SameSite=Strict";
- Hvis du angir
secure
, vilCookie
en kun bli sendt over HTTPS-kommunikasjon. - Hvis du angir
SameSite=Strict
, vilCookie
en ikke bli sendt ved forespørsler på tvers av nettsteder, noe som gjør det effektivt som mottiltak mot CSRF. - Slike sikre attributter er essensielle for viktige
Cookie
er brukt til autentisering eller sesjonshåndtering.
Koding og dekoding
Siden informasjonskapselverdier kan inneholde spesialtegn, er det tryggere å bruke encodeURIComponent
.
1const date = new Date();
2date.setTime(date.getTime() + (7 * 24 * 60 * 60 * 1000)); // 7 days
3
4const username = "JohnDoe";
5document.cookie =
6 "username=" + encodeURIComponent(username) +
7 "; max-age=604800; path=/; SameSite=None; Secure";
8
9console.log(decodeURIComponent(getCookie("username"))); // "JohnDoe"
- Ved å bruke
encodeURIComponent
, kan du trygt lagre mellomrom, symboler osv. i enCookie
. - Når du leser den ut, bruk
decodeURIComponent
for å returnere den opprinnelige strengen. - I dette eksempelet brukes
max-age=604800
for å sette utløpstiden til 7 dager (604 800 sekunder). Dette er en metode for å angi utløpsdato, liknendeexpires
.max-age
kan angis i sekunder og er ofte enklere å bruke.
Praktisk eksempel: Lagre og laste et tema
Følgende er et eksempel på å lagre brukerens valgte tema i en informasjonskapsel og automatisk bruke det ved neste besøk.
1function setTheme(theme) {
2 document.cookie =
3 "theme=" + encodeURIComponent(theme) +
4 "; max-age=604800; path=/; SameSite=None; Secure"; // 1 week
5 applyTheme(theme);
6}
7
8function applyTheme(theme) {
9 document.body.style.backgroundColor = theme === "dark" ? "#333" : "#fff";
10 document.body.style.color = theme === "dark" ? "#fff" : "#000";
11}
12
13function getCookie(name) {
14 const cookies = document.cookie.split('; ');
15 for (const cookie of cookies) {
16 const [key, value] = cookie.split('=');
17 if (key === name) {
18 return decodeURIComponent(value);
19 }
20 }
21 return null;
22}
23
24const savedTheme = getCookie("theme");
25if (savedTheme) {
26 applyTheme(savedTheme);
27}
1<button onclick="setTheme('light')">Light</button>
2<button onclick="setTheme('dark')">Dark</button>
- Funksjonen
setTheme
lagrer det valgte temaet i enCookie
og kaller umiddelbartapplyTheme
for å oppdatere skjermen. - Funksjonen
applyTheme
bytter bakgrunns- og tekstfarger tilbody
i henhold til temaet. - I dette eksempelet, siden
max-age=604800
er satt, beholdes temainnstillingen i én uke. - Siden brukerens valg kan beholdes ved gjenbesøk av siden, forbedres brukeropplevelsen (UX).
Begrensninger og forsiktighetsregler for informasjonskapsler
Vær oppmerksom på følgende punkter når du bruker informasjonskapsler:.
-
Størrelsesbegrensninger Størrelsen på en enkelt informasjonskapsel er begrenset til omtrent 4KB.
-
Begrensning på antall informasjonskapsler som kan lagres Avhengig av nettleseren, kan du bare lagre omtrent 20 til 50 per domene.
-
Sikkerhetsforanstaltninger Innholdet i
Cookies
lagres i utgangspunktet i klartekst, så det egner seg ikke til å lagre konfidensiell informasjon som passord. -
Cookies utilgjengelige fra JavaScript
Cookies
medHttpOnly
-attributtet kan ikke leses fra JavaScript av sikkerhetsgrunner.
Server og Cookies
1Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict
Noen Cookie
-attributter, som HttpOnly
, kan ikke settes via JavaScript. Disse må settes på serversiden.
Sammendrag
Manipulering av Cookies
med JavaScript kan forbedre brukeropplevelsen og opprettholde tilstand. Vennligst husk følgende punkter for å håndtere dem trygt og korrekt.
-
Lagre bare den nødvendige minimumsinformasjonen Fra et personvern- og sikkerhetsperspektiv bør man unngå å lagre personlig eller sensitiv informasjon og kun lagre de nødvendige dataene.
-
Sett sikkerhetsattributter riktig Sett attributter som
Secure
ogSameSite
for å motvirke angrep på tvers av nettsteder, som XSS og CSRF. -
Koding og dekoding av data Bruk
encodeURIComponent
ogdecodeURIComponent
for å trygt lagre og leseCookie
-verdier slik at spesialtegn og japansk håndteres korrekt.
Ved å lære korrekt bruk av Cookies
kan du bygge mer avanserte og sikre nettapplikasjoner.
Du kan følge med på artikkelen ovenfor ved å bruke Visual Studio Code på vår YouTube-kanal. Vennligst sjekk ut YouTube-kanalen.