IPRO - PC Magazine Romania, August 2003
SOLUȚII PENTRU PROGRAMATORII ȘI DESIGNERII WEB
Prăjiturele: Cookies în CFML (Cold Fusion Markup Language)
Alexandru Lazăr
Cookie-urile sunt deja un instrument obișnuit pentru toți designerii web. Chiar fără să știi, siturile pe care le accesezi curent folosesc aceste "prăjiturele" pentru vă face navigarea mai comfortabilă. Eu am început să apreciez aceste cookie-uri - recunosc, le consideram complet inutile - atunci când am văzut cum Yahoo! le folosește pentru paginile My Yahoo! scutindu-mă de introducerea la fiecare accesare a numelui de utilizator și a parolei.
Astfel, am încercat să le și folosesc și eu. N-a fost greu - pentru că ele sunt suportate deja de JavaScript și PHP, de exemplu - dar ce ne facem dacă avem un sit CFML? Ei bine, CFML poate folosi aceste cookie-uri, și încă fără prea mare efort din partea programatorului.
EU VREAU CU CĂPȘUNI...
OK, de fapt nu vorbeam de acele "cookies" pe care le găsim la cofetărieJ. Cookie-urile noastre sunt fișiere text, stocate "undeva" pe hard-disk. Aceste fișiere conțin date - aparent fără nici o noimă - care pot stoca însă traseul parcurs pe un sit, bannerele publicitare pe care le-ai văzut, username-ul și parola ta pentru a scăpa de fereastra cu "login" și așa mai departe. Spusesem mai sus că sunt fișiere text aparent fără nici o noimă. Iată cum arată un cookie pe care cei de la Tucows.com mi l-au strecurat pe hard-disk și care conține bannerele publicitare pe care le-am văzut:
NGUserID
d828206e-28726-1040126341-4
ads.tucows.com/
0
2189574144
32107986
2107712384
29095796
*
Cât se poate de clar, nu? :) Și totuși...
REȚETA
Înainte să te apuci de lucru, ar trebui să ai grijă ca browser-ul tău să accepte cookie-uri. Din motive de securitate, unii au grijă să le dezactiveze. Problema lor... au și ei oarecum dreptate, dar pentru liniștea mea personală, configurează browser-ul web pe care îl folosești pentru a accepta cookie-uri. Oricum, vom realiza un mic program care va testa cât de permisiv este browser-ul celui ce accesează pagina.
În CFML, vom folosi tagul <cfcookie> pentru a scrie cookie-uri, și apoi vom spune programului să le citească prin intermediul obiectului cookie. Ar trebui să fii atent ce și cât stochezi în cookie-uri: browser-ele moderne au o limită cu privire la dimensiuni, și în general e bine să fii econom cu aceste date pentru că unii devin suspicioși când se trezesc cu cookie-uri de 300 kb. Așadar, să luăm următorul exemplu:
<cfcookie
name = "color"
value = "red"
expires = "7"
secure = "No"
path = "/user/config"
domain = ".vitalstate.co.uk">
name = "color" spune browser-ului ce trebuie să stocheze în cookie. Acest atribut este necesar - în fond la ce ar folosi un cookie care nu stochează decât valori pentru nu_se_știe_ce. Apoi, value = "red" informează browser-ul cu privire la valoarea variabilei "color". Acest atribut este opțional - nu toate "name"-urile trebuie să aibă și valori.
Atributul expires este unul pe care îl vei folosi categoric, deoarece indică browser-ului când va expira cookie-ul. Deși este opțional, valoarea lui implicită este "now", deci cookie-ul va fi șters imediat. Și nu asta vrei, nu? Valoarea acestui atribut poate fi un număr de zile (ca aici), o dată anume (de exemplu 08/10/2003), "now" (șterge cookie-ul imediat) sau "never" (care lasă utilizatorului plăcerea de a șterge infamul fișier). Dacă lași "No" ca valoare a tag-ului secure, este totul OK. În schimb, dacă browser-ul celui care accesează pagina nu suportă SSL (Secure Socket Layers) iar tag-ul are valoarea "Yes", cookie-ul nu va fi trimis. Mare atenție însă: cookie-urile "sigure" nu funcționează decât cu protocolul https://.
Atributul path definește URL-ul din cadrul domeniului unde cookie-ul este activ. În fine, domain specifică domeniul unde vor fi folosite cookie-urile. Atenție însă, pentru că s-ar putea să te păcălești: este vorba, de fapt, de toate subdomeniile al căror nume se termină cu <domeniu>. Spre exemplu, cookie-ul din exemplul nostru va fi activ pentru www.vitalstate.co.uk dar și pentru www.site.vitalstate.co.uk sau pentru www.site1.vitalstate.co.uk . Dacă <domeniu> se termină cu sufixul specific unei țări (.ro, .us, .uk), trebuie să aibă în componență trei caractere [.], inclusiv cel de la început - când scrieți domeniile, toate trebuie să înceapă cu [.], adică ".domeniu.sufix" și nu simplu "domeniu.sufix". Nu poți folosi o adresă IP pentru domeniu.
Mai există câteva lucruri care ar trebui știute: în primul rând, atenție cum folosești tag-ul <cflocation>. Acesta redirecționează utilizatorul, dar înainte ca pagina unde dorea să ajungă inițial să fie încărcată. Browser-ul va scrie cookie-ul numai după ce a terminat de încărcat pagina. Așa că dacă folosești <cflocation>, cookie-ul nu va fi scris.
De asemenea, cu riscul de a mă repeta - este un lucru pe care unii îl uită
și care le dă apoi de furcă - stochează numai strictul necesar de informații
într-un cookie, pentru că protocolul HTTP impune o limită dimensiunilor unui
cookie (poți găsi specificațiile HTTP la www.allaire.com/Handlers/index.cfm?ID=1471&Method=Full&Cache=)
TEST
Vom construi un program care testează dacă browser-ul utilizatorului "a auzit" de SSL (Secure Socket Layers).
Așadar, mai întâi vom încerca să scriem un cookie. Vom folosi, la fel ca mai sus, tag-ul <cfcookie> pentru a scrie un cookie. Vom da atributului secure valoarea yes astfel încât cookie-ul să nu poată fi scris decât dacă browser-ul utilizatorului poate folosi SSL. Adică:
<!-- scrie cookie-ul -->
<!-- această porțiune de cod va intra într-un template -->
<cfcookie name="test" value="AcceptaSSL">
Dacă utilizatorul poate folosi SSL, cookie-ul va fi scris (din nou atenție, pentru că aceste cookie-uri "sigure" funcționează numai în cadrul protocolului https://).
Acum, vom cere programului să verifice dacă într-adevăr cookie-ul a fost scris. Pentru asta, vom folosi tag-ul <cfif> împreună cu IsDefined(), aceasta fiind cea mai elegantă metodă. În cazul în care utilizatorul are cookie-ul, atunci programul va afișa acest lucru. În caz contrar, va afișa faptul că utilizatorul nu acceptă cookie-uri. Așadar:
<!-- Într-un template separat -->
<cfif IsDefined(Cookie.test)>
<cfif Cookie.test eq "AcceptaSSL">
<cfoutput> Utilizatorul acceptă cookie-uri</cfoutput>
<cfelse>
<cfoutput> Utilizatorul nu acceptă cookie-uri</cfoutput>
</cfif>
<cfelse>
<cfoutput>Utilizatorul nu acceptă cookie-uri</cfoutput>
</cfif>
Vezi că am verificat două lucruri: dacă cookie-ul a fost scris și dacă valoarea variabilei "test" este "AcceptaSSL" (imaginează-ți ce s-ar întâmpla dacă utilizatorul ar avea într-un cookie o variabilă "test" cu o valoare diferită decât cea setată de noi, evident că securitatea n-ar fi aceeași). De aceea există două tag-uri <cfelse>, deoarece <cfif> verifică și prezența cookie-ului și valoarea variabilei care a fost stocată în el.
Iată deci cum ar trebui să arate rezultatul final:
<!-- scrie cookie-ul -->
<!-- această porțiune de cod va
intra într-un template -->
<cfcookie name="test" value="AcceptaSSL">
<!-- Într-un template separat -->
<cfif IsDefined(Cookie.test)>
<cfif Cookie.test eq "AcceptaSSL">
<cfoutput> Utilizatorul acceptă
cookie-uri</cfoutput>
<cfelse>
<cfoutput> Utilizatorul nu acceptă
cookie-uri</cfoutput>
</cfif>
<cfelse>
<cfoutput>Utilizatorul nu acceptă
cookie-uri</cfoutput>
</cfif>
MAI MULT...
Documentația Macromedia oferă foarte multe detalii, dar (cam ca și manualele
mele de la școală J) o poți citi de zece mii de ori și nu vei reuși să construiești
ceva util cu ce scrie acolo. De aceea, există un excelent tutorial despre cookie-uri
și CFML la hotwired.lycos.com/webmonkey/00/29/index3a.html?tw=programming.
Veți găsi foarte mult suport din partea comunității CFML, așa că nu îți fie
teamă să întrebi pe forumurile în temă. În plus, cookie-urile sunt una din părțile
căreia i se potrivește cel mai bine deviza "learn by doing". Le poți găsi
o infinitate de aplicații, de la eliminarea paginii de login și până la posibilitatea
utilizatorului de a configura aspectul paginii tale pentru calculatorul său
- ceea ce elimină, de exemplu, problema celor care încearcă să vizualizeze pagini
800x600 în rezoluții de 640x480. Așa că la lucru, și mult noroc!
|