Sunteți pe pagina 1din 5

Capitolul 11 Stocarea Informaiilor: Cookie-urile

n calitate de dezvoltator web putem stoca informaii despre utilizatorul care ne acceseaz saitul ntr-un loc pe discul utilizatorului, iar aceste informaii poart numele de cookie. Un cookie este un fiier text.

Construirea Primului Cookie


Cheia accesrii unui cookie este proprietatea omonim a documentului object:
<head> <script language=JavaScript type=text/javascript> document.cookie = UserName=Paul;expires=Tue, 28 Dec 2020 00:00:00;; </script> </head>

Vizualizarea Cookie-urilor n IE8


Tools -> Internet Options -> View Files

Vizualizarea Cookie-urilor n Firefox


Tools -> Internet Options -> Privacy ( Firefox 3.5 ) Preferences -> Privacy ( Firefox 17 )

irul De Caractere Cookie


n crearea unui cookie sunt ase atribute care pot fi definite: nume, valoare, data expirrii, cale, domeniu, tip conexiune ( ultimele 4 sunt opionale )

Nume i valoare
Perechea nume / valoare este esenial pentru un cookie ( a avea un nume i a stoca o valoare reprezint raiunea de a fi a unui cookie ) i ar trebuie s fie prima definit. Am putea scrie:

var expireDate = new Date(); expireDate.setMonth( expireDate.getMonth() + 6 ); document.cookie = ''UserName = Paul; expires = '' + expireDate.toGMTString() + '';

Cookie-ul creat va avea numele Paul i va expira n 6 luni.

Path
Serverele web, analog organizrii informaiei pe disc, folosesc directoare pentru stocarea fiierelor. n aceeai ordine de idei, cookie-urile nu sunt specifice doar unui nume de domeniu, cum ar fi wrox.com, ci i unei anumite ci din acel domeniu: dac o pagin din www.wrox.com/Books va defini un cookie, doar paginile din acel director sau din subdirectoare vor fi capabile s-l acceseze, nu i pagini din, s spunem, www.wrox.com/Academic. O utilitate a acestui atribut este reprezentat de urmtorul scenariu: o companie web care ofer spaiu de stocariu gratuit ( www.freespace.com ) pentru un utilizator ( www.freespace.com/members/bob ) nu i-ar dori ca cookie-urile sale s poat fi accesate de un alt utilizator ( www.freespace.com/members/alice ).

Avem un magazin online www.mywebsite.com/myStore, cu cookie-uri definite n subdirectoarele Books, Games i Checkout. Ne dorim ca cookie-urile definite n Books i Games s fie vizibile i pentru cookie-urile din pagina Checkout. Pentru a face posibil acest lucru, pentru cookie-urile definite n paginile Books i Games vom specifica la atributul path valoarea myStore, dei cookieurile nu sunt propriu-zis definite acolo. Dac definim un cookie astfel:
document.cookie = UserName=Paul;expires=Tue, 28 Dec 2020 00:00:00 + ;path=/myStore;;

el va fi visibil din directorul myStore, chiar dac el rezid ntr-un director diferit. Dac vrem ca un cookie s fie vizibil n orice director al domeniului, vom folosi ''path=/;''.

Domain
Avem un sait MyPersonalWebsite.MyDomain.com i unul MyBussinessWebsite.MyDomain.com. n mod normal, un cookie definit ntr-un subdomeniu nu va fi accesibil din cellalt. Dac dorim acest lucru, vom folosi atributul domain pentru a specifica faptul c un cookie este accesibil pentru ambele subdomenii: document.cookie = ''UserName = Paul; expires=Tue, 28 Dec 2020 00:00:00; path
= /'' + domain = MyDomain.com'';

Secure
Partea final, tipul conexiunii, este o valoare boleean. Dac are valoare true, cookie-ul va fi trimis doar dac avem o conexiune securizat ( SSL ).

Crearea Unui Cookie


Pentru a simplifica crearea unui cookie, vom folosi o funcie:
function setCookie(cookieName, cookieValue, cookiePath, cookieExpires) { cookieValue = escape(cookieValue); if (cookieExpires == ) { var nowDate = new Date(); nowDate.setMonth(nowDate.getMonth() + 6); cookieExpires = nowDate.toGMTString(); } if (cookiePath != ){ cookiePath = ;Path= + cookiePath; } document.cookie = cookieName + = + cookieValue + ;expires= + cookieExpires + cookiePath; }

Funcia escape() are rolul de a converti caracterele atribuite cookieValue n caractere acceptate. Dac variabila cookieExpires are o valoare nul ( cookieExpires = '' '' ), atunci data de expirare a cookie-ului va fi stabilit peste ase luni ( cookieExpires = nowDate.toGMTString();). Ultima linie de cod din funcie este cea care efectiv creeaz un cookie: Vom folosi setcookie() pentru a defini trei cookie-uri: Name, Age i FirstVisit:
setCookie(Name,Bob,,); setCookie(Age,101,,); setCookie(FirstVisit,10 May 2007,,); alert(document.cookie);

document.cookie = cookieName + = + cookieValue + ;expires= + cookieExpires + cookiePath;

Dac vrem s schimbm un parametru dintr-un cookie, definim din nou acel cookie cu parametrul modificat:
setCookie( ''Name'', ''Bobby'', '' '', '' '' );

Pentru a terge un cookie vom stabili data expirrii n trecut:

setCookie(Name,,,Mon, 1 Jan 1990 00:00:00);

Obinerea Valorii Unui Cookie


Urmtoarea funcie poate fi implementat n toate navigatoarele:
function getCookieValue( cookieName ) { var cookieValue = document.cookie; var cookieStartsAt = cookieValue.indexOf(" " + cookieName + "="); if ( cookieStartsAt == -1 ) { cookieStartsAt = cookieValue.indexOf(cookieName + "="); } if ( cookieStartsAt == -1 ) { cookieValue == null; } else { cookieStartsAt = cookieValue.indexOf("=", cookieStartsAt) + 1; var cookieEndsAt = cookieValue.indexOf(";", cookieStartsAt); if ( cookieEndsAt == -1 ) { cookieEndsAt == cookieValue.length; } cookieValue = unescape( cookieValue.substring(cookieStartsAt, cookieEndsAt)); } return cookieValue; }

Primul pas, stocarea irului de caractere document.cookie ntr-o variabil:


var cookieValue = document.cookie;

Vefificm existena cookieName n irul de caractere cookieValue:


var cookieStartsAt = cookie.value.indexOf(" " + cookieName + "="); Motivul utilizrii expresiei de cutare " " + cookieName + "=": dac nu am folosi un

spaiu nainte numelui cookie-ului, n eventualitatea n care am cuta un cookie cu numele Foo, am putea obine i alte potriviri: xFoo, yFoo. Dac cookieStart returneaz -1, exist dou posibiliti: cookie-ul nu exist sau se afl chiar la nceputul irului de caractere, situaie n care nu exist niciun spaiu naintea numelui su. Pentru a testa aceste ipoteze, se efectueaz o alt cutare, de aceast dat fr spaiu:
if ( cookieStartsAt == -1 ) { cookieStartsAt = cookieValue.indexOf(cookieName + "="); }

Urmtoarea declaraie verific rezultatul cutrii. Dac i aceasta returneaz -1, cookie-ul cutat nu exist i cookieValue primete valoarea null. Dac cookie-ul exist, obinem valoarea acestuia imediat dup semnul =. n urmtoarea linie, gsim semnul = care urmeaz numelui cookie-ului n irul de caractere prin efectuarea unei cutri indexOf() pentru semnul egal de la caracterul de unde perechea nume / valoare ncepe:
else { cookieStartsAt = cookieValue.indexOf("=", cookieStartsAt) + 1;

Sfritul cookie-ului se va afla fie la urmtorul caracter ;, fie la sfritul irului. Vom face mai nti o cutare pentru ;: var cookieEndsAt = cookieValue.indexOf('';'', cookieStartsAt); Dac cookie-ul este ultimul din irul de caractere, nu va fi gsit '';'' i va fi returnat o valoare de -1. n acest caz, sfritul valorii cookie-ului va fi acelai cu poziia ultimului caracter din ir:
if ( cookieEndsAt == -1 ) { cookieEndsAt == cookieValue.length; }

Folosind metoda substring, vom decupa valoarea cookie-ului:

cookieValue = unescape( cookieValue.substring(cookieStartsAt, cookieEndsAt));

Un scenariu n care putem folosi cookie-uri: avem un sait cu dou pagini: de index i o alta cu modificri fcute n sait. Dorim s oferim o legtur ctre pagina cu modificri doar dac utilizatorul a vizitat pagina nainte ( dac exist un cookie ), dar nu a vizitat-o dup data ultimei actualizri:
<head> <title>Cookie Example</title> <script language=JavaScript type=text/JavaScript src=CookieFunctions.js></script> <script language=JavaScript type=text/javascript> var lastUpdated = new Date(Tue, 28 Dec 2020); </script> </head> <body> <h1 align=center>Welcome to my website</h1> <div align=center id=WhatsNewDiv></div> <script> var lastVisit = getCookieValue(LastVisit); if (lastVisit != null) { lastVisit = new Date(lastVisit); if (lastVisit < lastUpdated) { document.getElementById(WhatsNewDiv).innerHTML = <a href=WhatsNew.htm><img src=WhatsNew.jpg border=0></a> } } var nowDate = new Date(); setCookie(LastVisit, nowDate.toGMTString(),,) </script>

Fiierul CookieFunctions conine funciile getCookieValue i setCookie.

Limitri Ale Cookie-urilor


1.Un utilizator poate dezactiva suportul pentru cookie-uri din navigator. Putem folosi acest script, pentru a testa suportarea cookieurilor:
setCookie ( ''TestCookie'',''Yes'','' '', '' '' ); if ( getCookieValue(''TestCookie'') == null ) { alert ( ''Acest sait necesit activarea cookie-urilor pentru a funciona!''); }

2.Navigatoarele au o limit pentru numrul total de cookie-uri acceptate i pentru numrul de cookie-uri acceptate pentru un sait. O soluie temporar const n stocarea unor informaii relaionate mpreun. Cookie-uri multiple:
setCookie(Name,Karen,,) setCookie(Age,44,,) setCookie(LastVisit,10 Jan 2001,,)

Condensarea informaiilor ntr-o singur valoare: setCookie(UserDetails,Karen;44;10 Jan 2001,,) 3.Securitatea Cookie-urilor i IE6 Prin Tools -> Internet Options -> Privacy putem stabili nivelul de intimitate privitor la cookie-uri ( o implementare a P3P w3.org/P3p ). n general, cookie-urile de sesiune ( valabile pe durata vizitei unui sait ) sunt universal permise.

Rezumat
Cheia accesrii unui cookie este proprietatea cookie ( pentru obiectul document ). Crearea unui cookie implic definirea valorilor din proprietatea cookie ( nume, valoare, data

expirrii, calea n care este disponibil, domeniul, dac ar trebui trimis doar pe o conexiune securizat. Recuperea unui cookie este mai complicat: document.cookie conine toate cookie-urile definite pentru o cale / domeniu, de aceea e necesar s folosim metodele obiectului String pentru a analiza irul de caractere n perechi nume / valoare. Cookie-urile prezint dezavantaje: dezactivarea suportului oferit de navigator, numrul care poate fi stocat.

Exerciii
1.Creeaz o pagin care contorizeaz numrul de vizite ale unui utilizator din ultima lun. 2.Folosete cookie-uri pentru a afia reclame diferite la fiecare vizit a utilizatorului.

S-ar putea să vă placă și