HTTP Cookie je nějaký textový soubor, který je součástí odpovědi webového serveru. Tato data si prohlížeč automaticky uloží. Jakmile někdy v budoucnu klient posílá tomuto webovému serveru další požadavek, pošle mu spolu s ním i uložená cookies.
Vzhledem k tomu, že cookies jsou součástí hlavičky HTTP požadavku, si je představíme zde.
To, že cookies jsou uloženy na straně klienta má pro autora webových stránek kladné i záporné vlastnosti. Cookies nám umožňují ukládat a zpětně využívat data při opakovaných návštěvách z téhož počítače, což může do jisté míry automatizovat činnost klienta. Toho se využívá konkrétně například při vyplňování formulářů, při ukládání nastavení apod. Mezi negativní důsledky patří to, že se nelze na nic spolehnout. Klient si může s cookies volně manipulovat - může je mazat nebo libovolně upravovat.
Struktura cookie
Cookie je fyzicky šestice datových položek. Jsou to následující.
- Název cookie - z jednoho serveru můžeme uchovávat několik cookies, které se budou lišit v názvu.
- Hodnota
- Doména - jméno webového hostitele, ze kterého sem byla cookie uložena
- Cesta - určuje, na který adresář domény budou cookies odesílány
- Čas vypršení - čas, kdy cookie pozbyde platnosti
- Secure - klient neodešle cookie, nebude-li to bezpečné
Poznámka - Pro názornější představu, jak cookies fungují, můžeme nahlédnout do svého www prohlížeče na nastavení cookies. Zde je seznam všech dostupných cookies i s hodnotami.
Náhled na cookies v prohlížeči
Ukládání cookies a modul CGI
Jednou z HTTP hlaviček je i Set-Cookie. Tu nastavujeme klíčem -cookie, předanému funkci header, jež generuje hlavičky.
Hodnotou Set-Cookie je řetězec formátovaný tak, aby obsáhl všechny datové položky cookies. Pro zformátování zde máme funkci cookie, která je součástí importované třídy :cgi a tedy i :standard.
Funkce cookie přijímá jako parametr opět hash, který může obsahovat prvky -name, -value, -domain, -path, -expires a -secure. Hodnotami těchto prvků jsou příslušné výše uvedené datové položky.
Hodnotou položky -expires může být buď datum ve formátu DD-MMM-YYYY hh:mm:ss, například 21-Feb-2009 09:11:55, nebo now pro platnost do konce relace. Dále je možné užít hodnotu ve formátu +<číslo><jednotka>. Taková cookie vyprší za daný počet jednotek. Dostupné jednotky jsou v tabulce.
Jednotka | Význam |
s | sekunda |
m | minuta |
h | hodina |
d | den |
M | měsíc |
y | rok |
Uveďme si příklad uložení cookie. Nejprve vytvoříme cookie stejnojmenou funkcí a následně odešleme hlavičky.
#!/usr/bin/perl
use strict;
use CGI qw(:standard);
my $cookie = cookie(
-name=>"pocet_navstev",
-value=>1,
-expires=>"+10d",
);
print header(-type=>"text/plain", -cookie=>$cookie);
#následuje samotný obsah dokumentu
Nyní se podívejte ve vašem oblíbeném www prohlížeči na správu cookies. Vytvořila se zde nová položka. Na adrese localhost máme proměnnou pocet_navstev s hodnotou 1. Zde je screenshot zobrazující správu cookies v Konqueroru, kde je hezky vidět, co se stalo.
Naše první cookie
Je-li zapotřebí uložit více než jedinou cookie, lze jako argument prvku -cookie předat odkaz na seznam.
print header(-cookie=>[$cookie1,$cookie2]);
Získávání uložených cookies a modul CGI
Voláním funkce cookie s jménem cookie jako parametrem získáme nazpět hodnotu.
$cookie = cookie("cookie");
V seznamovém kontextu vrací funkce cookie seznam jmen všech cookies.
Příklad - počítadlo návštěv
Na závěr si napíšeme jednoduché počítadlo návštěv. Pokaždé, když návštěvník zobrazí naši stránku, dostane informaci, kolikkrát tu byl.
#!/usr/bin/perl
use strict;
use CGI qw(:standard);
my $pocet_navstev = cookie("pocet_navstev") or 0;
$pocet_navstev++;
my $cookie = cookie(
-name=>"pocet_navstev",
-value=>$pocet_navstev,
-expires=>"+1y",
);
print header(-cookie=>$cookie);
print start_html();
if($pocet_navstev == 1){
print h1("Vítejte! Jste zde poprvé!");
}else{
print h1("Jste tu již po $pocet_navstev.");
}
print end_html();
Nyní tento skript několikkrát spustíme a budeme monitorovat stav cookies. Zde vidíme, jak se hodnota naší cookie mění.