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.