Kurs: - Core JavaScript Programming
Modul: Rukovanje stanjem i podacima
Autor: Vladimir Marić
Naziv jedinice: Cookie-s
Materijali vezani uz ovu lekciju:
-
Test cookie-s -
Cookie-s (PDF dokument)
JavaScript nije serverski programski jezik ni serverska tehnologija. Zato i nije u stanju da podrži preuzimanje podataka sa servera u šta spadaju sesije i post parametri (osim ukoliko se koriste HttpRequest objekti, odnosno AJAX tehnologija).
Sa druge strane, JavaScript-om možete pročitati vrednosti GET parametara i Cookie-a.
Čitanje parametara iz URL String-a
Poznat nam je objekat window i njegovo svojstvo objekat location. Sećamo se da je u njemu sadržana puna adresa dokumenta (ona koja je ispisana u URL String-u). location poseduje takođe svojstvo koje se zove search i koje sadrži samo upitni deo URL String-a (na svaku adresu u URL String-u, moguće je dodati i upitni deo što se postiže tako što se nakon adrese, postavi znak pitanja, a zatim upišu i parovi ključeva i vrednosti za parametre, odvojeni znakom &. Na primer: http://www.mojSajt.com/index.html?id=5&x=30&y=50).
Ono što možemo, to je da ručno pretražimo ceo upitni deo, zatim uporedimo sve parametre sa onim koji nam je potreban čiju ćemo vrednost, ukoliko postoji, proslediti kao izlaz celog ovog procesa:
var trazeniParametar="id"; //parametar koji nam je potreban
var upit=window.location.search.substring(1); // preuzimamo upitni deo url stringa i skidamo prvi karakter (?)
var parametri=upit.split("&"); //pravimo niz od svih parametara tako sto secemo upitni deo po znaku & (tako da na kraju, posedujemo niz: id=5, x=30, y=50)
var vrednost = "-1"; //inicijalizujemo izlaznu vrednost na -1 (recimo da je to neka nasa interna greska)
for(i=0;i<parametri.length;i++) // zapocinjemo petlju, kojom prolazimo kroz ceo niz parametara
{
if(parametri[i].split("=")[0]==trazeniParametar) // prilikom svake iteracije niza, pravimo jos jedan niz od clana niza. U svakom tom novonastalom nizu nalaze se dva clana 0=naziv parametra i 1=vrednost. Proveravamo da li se clan sa indeksom 0 poklapa sa trazenim parametrom i ako se poklapa....
vrednost=parametri[i].split("=")[1]; // ... dodeljujemo promenljivoj vrednost koja se nalazi u indeksu 1 novonastalog niza (ovde opciono mozemo napraviti i prekid petlje (break))
}
document.write("Parametar "+trazeniParametar+" je " + vrednost); //ispis vrednosti trazenog parametra
Logično je da ovakav jedan mehanizam nađe svoje mesto u funkciji:
function preuzmiParametar(p)
{
var trazeniParametar=p;
var upit=window.location.search.substring(1);
var parametri=upit.split("&");
var vrednost = "-1";
for(i=0;i<parametri.length;i++)
{
if(parametri[i].split("=")[0]==trazeniParametar)
{
vrednost=parametri[i].split("=")[1];
break;
}
}
return vrednost;
}
var parametar="id";
document.write("Parametar "+parametar+" je " + preuzmiParametar(parametar));
Postavljanje i čitanje parametara iz Cookies-a
Cookies je, za razliku od URL String-a, nešto ozbiljniji način za rukovanje parametrima.
Ono što je potrebno da znamo u vezi sa njima je da:
- Ne trpe velike količine podataka (štaviše, ne trpe iznad 4 kB podataka).
- Sastoje se iz parova ključeva i vrednosti.
- Poseduju vreme kreacije i vreme isticanja (što su, kasnije ćemo imati priliku da vidimo, veoma bitni parametri za rukovanje Cookies-ima).
- Poseduju informaciju o domenu porekla.
- Osnovna ideja je kretanje jedinstvene informacije kroz ceo domen.
Cookie se u JavaScript-u nalazi u sklopu document objekta u svojstvu Cookies. Da bismo kreirali Cookies, potrebna su nam minimum dva (tri) parametra. Prvi parametar su ključ i vrednost (otuda tri u zagradi), a drugi, datum isticanja. Datum isticanja je vrlo bitna komponenta, jer osim što regulišemo kada će Cookies isteći, možemo ga upotrebiti i da uništimo trenutno aktivne Cookies-e. Pogledajmo primer:
var trenutnoVreme = new Date();
var isticanje = new Date(trenutnoVreme.getTime() + 31536000000);
U primeru, isprva nam je potreban jedan objekat tipa Date(). Ovaj objekat (trenutno vreme), koristimo da bismo sagradili novi objekat tipa Date, ali ovaj put kao kombinaciju trenutnog vremena i trajanja Cookie-a. U primeru, veliki broj (trajanje Cookie-a) predstavlja broj milisekundi u jednoj godini, pa će vrednost promenljive isticanje biti trenutno vreme + jedna godina.
Nakon toga, potrebno je da definišemo Cookie unosom željenih vrednosti:
document.cookie="mojKuki=moja vrednost; expires=" + isticanje .toUTCString();
Vidimo da se kreiranje Cookie-a vrši uz pomoć String-a.
U primeru smo postavili statičke vrednosti za naziv Cookie-a i njegovu vrednost, ali u praksi ove dve vrednosti treba da budu parametrizovane (isto kao Expires vrednost). Pomenuti Expires parametar predstavlja datum isteka Cookie-a (koji treba da bude u UTC ili GMT formatu, pa treba koristiti toUTCString() ili toGMTString() funkcije), za koji ćemo postaviti vrednost promenljive isticanje (koja predstavlja godinu dana od današnjeg dana). Potpuno dinamički primer mogao bi izgledati ovako:
function napraviKuki(naziv,vrednost,rokTrajanja)
{
var trenutnoVreme = new Date();
var isticanje = new Date(trenutnoVreme.getTime() + (rokTrajanja * 86400000)+7200000);
document.cookie=naziv+"="+vrednost+"; expires="+isticanje.toUTCString();
}
A sama kreacija Cookie-a ovako:
napraviKuki("mojKuki","moja vrednost cookiea",1);
Ovo je zapravo i kompletna procedura za postavljanje Cookie-a. Ukoliko ovo prođe bez greške, Cookie će biti postavljen i moći će da bude vidljiv sve do isteka vremenskog roka. Takođe, moći će da bude vidljiv, ne samo iz JavaScript-a, već i iz serverskih skripti.
Ukoliko ne bismo postavili vremensko ograničenje, Cookie bi bio valildan do gašenja klijentske aplikacije.
Ukoliko želimo da obrišemo Cookie, treba samo ponovo da ga inicijalizujemo, ali sa trenutnim ili vremenom ispod trenutnog.
Na primer:
var trenutnoVreme = new Date();
var isticanje = new Date(trenutnoVreme.getTime());
document.cookie="mojKuki=moja vrednost; expires=" + isticanje.toUTCString();
Naravno, ukoliko smo napravili funkciju napraviKuki() u primeru pre ovoga, onda možemo to uraditi i uz pomoć nje:
napraviKuki("mojKuki","moja vrednost cookiea",-1);
Za čitanje parametara iz Cookie-a, možemo upotrebiti sličnu tehnologiju kao i pri čitanju URL String-a. S obzirom na to da se svi ključevi i vrednosti jednog Cookie-a, nalaze u String-u delimitiranom oznakom ; dovoljno je da prevedemo taj String u niz i potražimo element koji nam je potreban, odnosno, koji odgovara traženom ključu:
var trazeniKuki="mojKuki";
var kukiji=document.cookie.split("; ");
var vrednost="-1";
for(i=0;i<kukiji.length;i++)
{
if(kukiji[i].split("=")[0]==trazeniKuki)
{
vrednost=kukiji[i].split("=")[1];
break;
}
}
document.write(vrednost);
Iz primera vidimo da se svi Cookies-i nalaze u objektu document.cookie. Ovaj kod emitovaće vrednost Cookie-a (ako smo startovali Cookie) ukoliko ga postavimo na bilo koju stranu istog domena. Naravno, i ovde, kao i u primeru sa čitanjem parametara iz URL String-a, funkcionalnost je poželjna. Evo kako bi trebalo da izgledala funkcija za čitanje Cookie-a:
function uzmiKuki(naziv)
{
var trazeniKuki=naziv;
var kukiji=document.cookie.split("; ");
var vrednost="-1";
for(i=0;i<kukiji.length;i++)
{
if(kukiji[i].split("=")[0]==trazeniKuki)
{
vrednost=kukiji[i].split("=")[1];
break;
}
}
return vrednost;
}
document.write(uzmiKuki("mojCookie"));
Osim dva pomenuta, postoji još nekoliko opcionih parametara u kreaciji Cookie-a:
- path
Ukoliko ne želimo da smeštamo Cookies-e u podrazumevani folder na disku, možemo kao ovaj parametar uneti alternativni folder.
- domain
Cookie može otvoriti samo domen koji ih je i kreirao. Kao parametar možemo uneti naziv tog domena.
- secure
Ukoliko je ova opcija uključena Cookie će moći da bude pročitan i kreiran samo preko SSL konekcije (https protokol).
Na kraju, pomenimo da Cookies-i, osim u količini podataka koju mogu da ponesu (4k) imaju još neka ograničenja. Ne možemo postaviti više od 20 Cookies-a po domenu, a sam pretraživač ne može da podnese više od 300 Cookies-a (ukoliko se ovaj broj premaši, biće obrisani poslednji korišćeni Cookie-i).
Najvažnije iz lekcije
- JavaScript je u stanju da obradi GET parametre (URL String) i Cookie parametre.
- Cookies-i ne mogu biti veći od 4KB, ne može ih biti više od 20 po domenu i više od 300 po pretraživaču.
- Podaci o URL String-u nalaze se u window.location.search svojstvu.
- Parametri za kreiranje cookie-a su ime, expires, path, domain i secure.
- Cookies-i se nalaze u objektu document.cookie i razdvojeni su oznakama '; '.