Piškotki

Piškotki so mehanizem, ki omogoča spletnemu brskalniku, da si zapomni, kaj je uporabnik počel na spletni strani (kdaj je odprl neko stran, kaj je vpisal v obrazec, kateri gumb ali povezavo je pritisnil ...). Najlažje si jih predstavljamo kot posebno vrsto spremenljivk, ki jih hrani spletni brskalnik (kje in v kakšni obliki, je odvisno od posameznega brskalnika).
Ko brskalnik od strežnika zahteva novo stran, poleg zahtevka pošlje tudi vse pripadajoče še veljavne piškotke. Strežnik se na podlagi vrednosti teh piškotkov odloči, kako ukrepati in kaj vrniti. Poleg nove strani lahko strežnik pošlje tudi nove piškotke ali nove vrednosti za že obstoječe piškotke. V vsakem primeru pa novemu dokumentu nastavi lastnost document.cookie, tako da vsebuje imena in vrednosti vseh prejetih piškotkov.
Če delamo lokalno (brez strežnika), vlogo strežnika prevzame kar spletni brskalnik. Ko mu pošljemo zahtevek po novi strani, to stran prikaže, poleg pa nastavi tudi lastnost document.cookie, tako da razlike skoraj ni opaziti.
Preko lastnosti document.cookie pa lahko piškotke uporabljamo tudi v JavaScriptu. Lahko definiramo nove, uporabljamo vrednosti obstoječih ...

Opis piškotka

Opis piškotka je sestavljen iz več delov, ki so med seboj ločeni s podpičji. Poleg imena in vrednosti ima vsak piškotek še datum, do kdaj je veljaven, vezan pa je tudi na skupino strani na izbrani skupini strežnikov. Poleg tega lahko ima nastavljeno lastnost, da ga smemo pošiljati samo preko varnih povezav. Obvezen je samo del z imenom in vrednostjo, vse ostale lahko izpustimo, vključno s pripadajočimi podpičji. Polna oblika opisa piškotka izgleda takole:
ime=vrednost; expires=rok; path=pot; domain=domena; secure
Vsak piškotek mora imeti ime in vrednost (zato je prvi del opisa obvezen), pri čemer je lahko vrednost tudi prazna. Preko imena lahko kasneje dostopamo do vrednosti piškotka. Priporočljivo je, da vse znake v vrednosti, ki niso črke ali števke, zakodiramo tako, da jih nadomestimo z znakom % (procent) in dvema šestnajstiškima števkama, ki ustrezata kodi znaka. To je natanko tako, kot to stori vgrajena funkcija escape.
Podatek expires določa, kako dolgo bo piškotek veljaven. Po izteku tega roka bo spletni brskalnik piškotek zbrisal. Vrednost tega podatka mora biti v standardni obliki, kot jo vrne metoda toUTCString razreda Date, na primer: "". Če podamo rok, ki je že potekel, bo brskalnik piškotek takoj pobrisal. Če roka ne določimo, veljavnost piškotka poteče, ko uporabnik zapusti naše spletne strani.
Podatek domain določa skupino strežnikov, katerim je piškotek namenjen. Vrednost .fmf.uni-lj.si določa, da bo spletni brskalnik poleg vsakega zahtevka po novi strani kateremu od strežnikov v tej domeni poslal tudi podatke o piškotku. Privzeta vrednost te lastnosti je domena strežnika, ki je piškotek nastavil.
Podatek path določa pot do datotek na strežniku, katerim je piškotek namenjen. Vrednost / pravi, da je piškotek namenjen vsem datotekam, vrednost /doc pa seznam datotek omeji na tiste, ko so v mapah, katerih ime se prične na doc, in v vseh njihovih podmapah. Privzeta vrednost te lastnosti je pot do datoteke, od koder smo nastavili piškotek.
Podatek secure (ta nima vrednosti) pa določa (če ga napišemo), da lahko piškotek strežniku pošljemo samo po varnih povezavah. Če tega ne napišemo, lahko brskalnik pošlje piškotek tudi po nezavarovanih povezavah.

Nastavljanje piškotkov

Piškotke nam lahko nastavi že strežnik, ko nam pošlje izbrano stran. To stori s pomočjo določila Set-Cookie v opisu, ki spremlja poslano datoteko. Tak opis običajno vsebuje podatke o vrsti in dolžini datoteke, uporabljeni kodni tabeli, lahko pa vsebuje tudi piškotke.
Set-Cookie: opis piškotka
Piškotek je lahko zapisan tudi v glavi same datoteke HTML, kar velja tudi za druge podatke, ki jih lahko pošlje strežnik v spremljajočem opisu datoteke. Piškotek v glavo datoteke HTML dodamo s pomočjo značke meta:
<meta http-equiv="Set-Cookie" content="opis piškotka">
Piškotek pa si lahko nastavimo tudi z JavaScriptom. Ob določenem dogodku (ko uporabnik izpolni obrazec, klikne na sliko, ali kaj podobnega) izvedemo naslednji ukaz:
document.cookie = "opis piškotka"
Lastnost document.cookie se na prvi pogled obnaša malo čudno. Če definiramo najprej en piškotek, nato pa še drugega, prvega s tem nismo izgubili. Prirejanje vrednosti tej lastnosti namreč ni običajno prirejanje, pač pa pomeni definicijo novega piškotka, ki ima za stranski učinek spremembo vrednosti lastnosti.
Vrednost lastnosti document.cookie je niz, ki vsebuje zaporedje imen in vrednosti vseh pripadajočih še veljavnih piškotkov v spodnji obliki. Druge lastnosti piškotkov so nam torej skrite. Če nas zanima vrednost določenega piškotka, moramo v tem nizu poiskati ustrezno ime in izluščiti vrednost, ki sledi.
"ime_1=vrednost_1; ime_2=vrednost_2; ... ime_n=vrednost_n"

Zbirka funkcij za lažje delo s piškotki

Kot smo videli, vse delo s piškotki v JavaScriptu poteka preko lastnosti document.cookie. Piškotek nastavimo tako, da tej lastnosti priredimo ustrezen opis, vrednost določenega piškotka pa z nekaj truda spet dobimo iz vrednosti te lastnosti. Spodaj je zbranih nekaj funkcij za preprostejše delo s piškotki.
S funkcijo setCookie lahko nastavimo piškotek. Funkcija sprejme kar nekaj parametrov, od katerih sta obvezna samo prva dva (ime in vrednost). Parameter rok mora biti (če ga podamo) objekt razreda Date, parametra pot in domena sta niza, parameter varno pa logična vrednost.
function setCookie(ime, vrednost, rok, pot, domena, varno)
{
   document.cookie =
      ime + "=" + encodeURIComponent(vrednost) +
      ((rok) ? "; expires=" + rok.toUTCString() : "") +
      ((pot) ? "; path=" + pot : "") +
      ((domena) ? "; domain=" + domena : "") +
      ((varno) ? "; secure" : "")
}
S funkcijo deleteCookie lahko piškotek zbrišemo. Funkcija ima en obvezen parameter (ime), ki določa, kateri piškotek želimo zbrisati. Parametra pot in domena morata imeti enakii vrednosti kot takrat, ko smo piškotek nastavili.
function deleteCookie(ime, pot, domena)
{
   document.cookie =
      ime + "=" +
      "; expires=Thu, 01-Jan-70 00:00:01 GMT" +
      ((pot) ? "; path=" + pot : "") +
      ((domena) ? "; domain=" + domena : "")
}
S funkcijo getCookie pa si delo s piškotki resnično olajšamo. Funkcija namreč poišče in vrne vrednost piškotka z danim imenom, pri čemer ima kar precej dela, saj je vrednost piškotka zapisana nekje v nizu document.cookie.
function getCookie(ime)
{
   ime += "="
   var dc = document.cookie
   var start = dc.indexOf("; " + ime)
   if (start >= 0) start += 2
   else {
      start = dc.indexOf(ime)
      if (start != 0) return null
   }
   start += ime.length
   var konec = dc.indexOf(";", start)
   if (konec == -1) konec = dc.length
   return decodeURIComponent(dc.substring(start, konec))
}
Pri nastavljanju veljavnosti piškotka bo v precejšnjo pomoč funkcija afterSomeDays, ki sestavi in vrne datum, kakršen bo čez nekaj dni (število dni je parameter).
function afterSomeDays(dnevi)
{
   var datum = new Date()
   datum.setTime(datum.getTime() + dnevi * 86400000)
   return datum
}
Vse prikazane funkcije so zapisane na datoteki piskotki.js, ki jo samo vključimo v svoj dokument HTML, če katero od teh funkcij potrebujemo. To datoteko uporabljamo tudi v primerih, ki sledijo.

Primeri

Opombe

Čeprav se zdi, da nam uporaba piškotkov reši marsikateri problem, je potrebno dobro premisliti, ali naj jih uporabimo. Pri njihovi uporabi nastopita dve težavi.
Uporabnik lahko v svojem brskalniku izklopi možnost dela s piškotki (kako se to naredi, je odvisno od brskalnika). Nastavitev piškotka v takem brskalniku nima nobenega učinka.
Brskalniki imajo običajno omejen prostor za shranjevanje piškotkov. Poleg tega omejujejo še skupno število piškotkov, dolžino piškotka in število piškotkov na posamezno domeno.