Cookies è õðàíåíèå ñîñòîÿíèÿ
Àâòîð: Àðòåìüåâ Ñåðãåé Èãîðåâè÷ ICQ: 438856621 email: _spin_@bk.ru |
Êàê ìû óæå ãîâîðèëè, ïðè êàæäîé çàãðóçêå ñòðàíèöû è ïðè êàæäîì å¸ îáíîâëåíèè ñêðèïòû íà÷èíàþò âûïîëíÿòüñÿ çàíîâî. Ñ îäíîé ñòîðîíû - ýòî õîðîøî, ò.ê. ìîæíî íå çàáîòèòüñÿ î ïðåäûäóùèõ ñîñòîÿíèÿõ ñêðèïòà. Íî ñ äðóãîé ñòîðîíû – èíîãäà íàäî õðàíèòü äàííûå î ïðåäøåñòâóþùèõ äåéñòâèÿõ èëè ââåä¸ííûõ ïîëüçîâàòåëì äàííûõ.
 JavaScript ñóùåñòâóåò åäèíñòâåííûé ìåõàíèçì, ïîçâîëÿþùèé çàïîìíèòü ñâî¸ ñîñòîÿíèå – cookies (â ïåðåâîäå ñ àíãëèéñêîãî – «ïå÷åíüå»). Îòêóäà âçÿòî ýòî íàçâàíèå – òåïåðü ñêàçàòü ñëîæíî, íî ïðèíÿòî ñ÷èòàòü, ÷òî òåðìèí cookies ïîÿâèëñÿ åù¸ íà çàðå ðàçâèòèÿ Unix è ëîêàëüíûõ ñåòåé.
Cookie – ýòî íåáîëüøîé òåêñòîâûé áëîê, êîòîðûé áðàóçåð ñîõðàíÿåò íà äèñê ïðè ïåðâîé çàãðóçêå ñòðàíèöû. Ïðè ïîñëåäóþùèõ îáíîâëåíèÿõ ñòðàíèöû cookie áóäåò àâòîìàòè÷åñêè ïîñëàí ñåðâåðó âìåñòå ñ GET- èëè POST-çàïðîñîì.
Îáû÷íî cookie èñïîëüçóþòñÿ äëÿ õðàíåíèÿ íåáîëüøèõ ôðàãìåíòîâ äàííûõ, òàêèõ êàê èäåíòèôèêàòîðû ñåññèè PHP, âðåìåííûå ñåàíñîâûå êëþ÷è, õåøè ïàðîëåé è ò.ä. Ìàêñèìàëüíûé îáú¸ì äàííûõ, êîòîðûé ìîæíî ñîõðàíèòü â îäíîì cookie, ñîñòàâëÿåò 4 Êá, à ñðåäíèé îáú¸ì cookie îáû÷íî íå ïðåâûøàåò êèëîáàéòà. Óâëåêàòüñÿ õðàíåíèåì äàííûõ ñ cookies íå ñòîèò, ò.ê. îíè îòïðàâëÿþòñÿ íà ñåðâåð ïðè êàæäîì îáíîâëåíèè ñòðàíèöû. Òàê ÷òî åñëè âàøà ñòðàíèöà «âåñèò» 10 Êá, à â cookie âû ñîõðàíèëè âñå 4 Êá – òî âàø òðàôèê âûðàñòåò ïî÷òè â ïîëòîðà ðàçà.
Ëþáîé cookie ñîäåðæèò íåñêîëüêî ïîëåé ñ ôèêñèðîâàííûìè èìåíàìè:
expires | Äàòà è âðåìÿ èñòå÷åíèÿ "ñðîêà ãîäíîñòè" cookie. Ïî äîñòèæåíèè ýòîãî âðåìåíè îí áîëüøå íå áóäåò îòñûëàòüñÿ íà ñåðâåð. Åñëè ýòîò ïàðàìåòð íå óêàçàí - cookie ñîõðàíÿåòñÿ äî çàêðûòèÿ áðàóçåðà. Ïàðàìåòð äîëæåí âñåãäà çàäàâàòüñÿ â ôîðìàòå "Äåíü, ×èñëî-Äåí-ÃÃÃà ××:ÌÌ:ÑÑ GMT", Íàïðèìåð: expires=Mon, 20-Jan-2010 10:10:10 GMT Ýòîò cookie ïåðåñòàíåò îòñûëàòüñÿ íà ñåðâåð ïîñëå 10 ÷àñîâ 10 ìèíóò 10 ñåêóíä 20 ÿíâàðÿ 2010 ãîäà ïî Ãðèíâè÷ó. |
path | Ïóòü íà ñåðâåðå, äëÿ êîòîðîãî áóäåò èñïîëüçîâàòüñÿ ýòîò cookie. Åñëè âû õîòèòå çàäàòü cookie äëÿ âñåãî ñåðâåðà - ïîñòàâüòå "/"
|
domain | Èìÿ äîìåíà, äëÿ êîòîðîãî äåéñòâèòåëåí äàííûé cookie. Ýòîò ïàðàìåòð äåéñòâåò íå òîëüêî íà îñíîâíîé äîìåí, íî è âñå åãî ïîääîìåíû
|
secure | Ïàðàìåòð îïðåäåëÿåò, íàäî ëè èñïîëüçîâàòü äëÿ ïåðåäà÷è cookie øèôðîâàííîå ñîåäèíåíèå (HTTPS). Åñëè íå óñòàíîâëåí - èñïîëüçóåòñÿ îáû÷íîå ñîåäèíåíèå. |
Êðîìå ôèêñèðîâàííûõ ïîëåé, âû ìîæåòå çàäàâàòü ñâîè. Ýëåìåíòû çàäàþòñÿ â ôîðìàòå "ÈÌß=ÇÍÀ×ÅÍÈÅ", íàïðèìåð:
MYNAME=Äÿäÿ Âàñÿ
Ïåðåä òåì, êàê çàïðîñèòü ñòðàíèöó íà ñåðâåðå, áðàóçåð ïðîâåðÿåò, åñòü ëè ó íåãî óæå cookie îò äàííîãî ñåðâåðà (ïîëÿ path è domain). Åñëè åñòü è èõ «ñðîê ãîäíîñòè» íå èñò¸ê (ïîëå expires) – îòïðàâëÿåò íàéäåííûå äàííûå ñåðâåðó. Óñòàðåâøèå cookie áðàóçåð ïðè çàïðîñå ñòðàíèöû ïðîñòî èãíîðèðóåò.
Òåïåðü ðàññìîòðèì ïîðÿäîê ðàáîòû ñ cookies.
Åäèíñòâåííûé ñïîñîá äîáðàòüñÿ äî cookies òåêóùåãî äîêóìåíòà - èñïîëüçîâàòü âñòðîåííûé îáúåêò document.cookies. Ïî ñóòè ýòî ñòðîêà, ñîäåðæàùàÿ âñå cookie, îäèí çà äðóãèì, ðàçäåë¸ííûå òî÷êîé ñ çàïÿòîé:
èìÿ_1=çíà÷åíèå_1;èìÿ_2=çíà÷åíèå_2;.....
Íîâûé cookie äîáàâëÿåòñÿ îáû÷íûì ïðèñâîåíèåì îáúåêòó document.cookie íîâîãî çíà÷åíèÿ:
document.cookie = "myname=deniska";
Îáðàòèòå âíèìàíèå, ÷òî ïðè îáðàòíîé îïåðàöèè âû ïîëó÷èòå íå ïîñëåäíèé óñòàíîâëåííûé cookie, à ÂÑÅ cookies, ñîîòâåòñòâóþùèå äàííîìó äîêóìåíòó:
var list = document.cookie; // list òåïåðü ñîäåðæèò âñå cookie äîêóìåíòà
Ðàññìîòðèì êîìïëåêñíûé ïðèìåð, ñîçäàäèì íåñêîëüêî ôóíêöèé äëÿ ìàíèïóëèðîâàíèÿ cookies.
<script language="JavaScript"> // ïîëó÷åíèå cookie ïî çàäàííîìó ñìåùåíèþ function GetValue (offset) { var strEnd = document.cookie.indexOf (";", offset); if (strEnd == -1) strEnd = document.cookie.length; return unescape(document.cookie.substring(offset, strEnd)); } //ïîëó÷åíèå cookie ïî èìåíè function GetCookie(name) { var key = name + "="; var i = 0; while (i < document.cookie.length) { var j = i + key.length; if (document.cookie.substring(i, j) == key) return GetValue (j); i = document.cookie.indexOf(" ", i) + 1; if (i == 0) break; } return null; } // óñòàíîâêà cookie ïî èìåíè function SetCookie (name, value) { var argv = SetCookie.arguments; var argc = SetCookie.arguments.length; var expires = (argc > 2) ? argv[2] : null; var path = (argc > 3) ? argv[3] : null; var domain = (argc > 4) ? argv[4] : null; var secure = (argc > 5) ? argv[5] : false; document.cookie = name + "=" + escape (value) + ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + ((path == null) ? "" : ("; path=" + path)) + ((domain == null) ? "" : ("; domain=" + domain)) + ((secure == true) ? "; secure"; : ""); } // óäàëåíèå îäíîãî cookie function DeleteCookie(strName) { document.cookie = strName + "=0; expires=" + (new Date(0)).toGMTString(); } </script>
Òåïåðü ðàññìîòðèì ïðèìåð èñïîëüçîâàíèÿ íàøèõ ôóíêöèé:
<script language="JavaScript"> var userName = GetCookie('username'); if (userName == null) { // ïîëüçîâàòåëü íå çàðåãèñòðèðîâàí userName = 'Ãîñòü'; } else { // èçâëåêàåì òåêóùèé àäðåñ ñòðàíèöû pathName = location.pathname; // èç àäðåñà ïîëó÷åì ïîëíîå èìÿ äîìåíà domain = pathName.substring(0,pathName.lastIndexOf('/')) +'/'; // ïîëó÷àåì òåêóùóþ äàòó var expDate = new Date (); // óñòàíàâëèâàåì "ñðîê ãîäíîñòè"cookie íà ãîä expDate.setTime(expDate.getTime() + (365 * 24 * 3600 * 1000)); SetCookie('username',userName, expDate, domain); } // âûâîäèì èìÿ ïîëüçîâàòåëÿ íà ñòðàíèöó document.write('<p align="center">Çäðàâñòâóéòå, ' + userName + '</p>'); </script>
Êàê âèäèòå, ïîëüçîâàòüñÿ cookie äîñòàòî÷íî ïðîñòî. Ãëàâíîå - ïðàâèëüíî ôîðìèðîâàòü ñîîòâåòñòâóþùèå ñòðîêè ïàðàìåòðîâ.
 íàñòîÿùåå âðåìÿ ïðàêòè÷åñêè âñå áðàóçåðû ïîääåðæèâàþò cookies. Íåêîòîðûå ïîëüçîâàòåëè (ïðèìåðíî 2-4%) ïðèíóäèòåëüíî îòêëþ÷àþò òàêóþ ïîääåðæêó, õîòÿ ëè÷íî ÿ íè÷åãî îïàñíîãî â cookies íå âèæó. Ìàêñèìóì, ÷åì ìîãóò ïîâðåäèòü âêëþ÷åííûå cookies – çëîóìûøëåííèê ñìîæåò óçíàòü âàø ëîãèí è ïàðîëü ïî÷òîâîãî ÿùèêà, äà è òî – åñëè âû áóäåòå ñëèøêîì áåñïå÷íû è íà÷í¸òå îòêðûâàòü èç âåá-èíòåðôåéñà ïî÷òîâèêà âñÿêèå îòêðûòêè, øóòêè è ïðî÷èå îïàñíûå ïàêîñòè.
Îïðåäåëèòü, âêëþ÷åíû ó ïîëüçîâàòåëÿ cookie èëè íåò ìîæíî ïðè ïîìîùè ñëåäóþùåé ôóíêöèè:
// Ôóíêöèÿ âîçâðàùàåò true, åñëè cookie âêëþ÷åíû, // â èíîì ñëó÷àå - false function IsCookieEnabled() { // ïðîâåðÿåì ñóùåñòâîâàíèå ñâîéñòâà navigator.cookieEnabled if(typeof(navigator.cookieEnabled) != "undefined") return navigator.cookieEnabled; else { // åñëè ñâîéñòâî navigator.cookieEnabled // íå ïîääåðæèâàåòñÿ, òî ïðîñòî ïîïðîáóåì // óñòàíîâèòü è ïîëó÷èòü íàçàä òåñòîâûé cookie var tmpCookie = "testCookieForCheck"; SetCookie(tmpCookie, "1"); if(GetCookie(tmpCookie) != null) { DeleteCookie(tmpCookie); return true; } return false; } }
Ñookies äàþò ìàññó ïðåèìóùåñòâ. Íàïðèìåð, ïðè ðåãèñòðàöèè íà ñàéòàõ â ôîðìå ðåãèñòðàöèè îáû÷íî åñòü ãàëî÷êà «çàïîìíèòü ìåíÿ». Åñëè âû å¸ íå ñòàâèòå – ñåðâåð ñîõðàíÿåò âðåìåííûé cookie, äåéñòâèòåëüíûé ëèøü äî çàêðûòèÿ áðàóçåðà. À âîò åñëè âû ãàëî÷êó ïîñòàâèëè – ñåðâåð ñîõðàíèò cookie ñ äëèòåëüíûì ñðîêîì æèçíè, à çíà÷èò ïðè ñëåäóþùåì çàõîäå íà ýòîò ñàéò âû áóäåòå àâòîìàòè÷åñêè èäåíòèôèöèðîâàíû ïî ðàíåå ñîõðàí¸ííûì äàííûì. Àíàëîãè÷íûé ïðè¸ì èñïîëüçóåòñÿ íà áîëüøèíñòâå ñàéòîâ.  áîëüøèíñòâå áðàóçåðîâ ïðåäóñìîòðåíà âîçìîæíîñòü ïðîñìîòðà è óïðàâëåíèÿ cookie. Òàê ÷òî âû ìîæåòå â ëþáîé ìîìåíò çàéòè è ïîñìîòðåòü êòî è ÷òî âàì ñîõðàíÿë.
Ñîõðàíåíèå ñîñòîÿíèÿ ñòðàíèö â íåêîòîðûõ ñëó÷àÿõ ñóùåñòâåííî îáëåã÷àåò íàâèãàöèþ ïî ñàéòó è ïðèâëåêàåò âîçìîæíûõ ïîñåòèòåëåé è êëèåíòîâ, à ýòî â ñâîþ î÷åðåäü ñïîñîáñòâóåò áûñòðîé ðàñêðóòêå ñàéòà. Íî íàèáîëåå ýôôåêòèâíûé ìåòîä – îäíîâðåìåííîå ñîõðàíåíèå ñîñòîÿíèÿ êàê íà ñòîðîíå êëèåíòà (ñ ïîìîùüþ cookies), òàê è íà ñòîðîíå ñåðâåðà (íàïðèìåð, ñ ïîìîùüþ ñåññèé).