Nézzük röviden mi is a Cookie, mire jó. Ez nem más, mint egy olyan speciális állomány, mely a kliens gépén tárolódik. Ebben tetszőleges adatokat helyezhetünk el és amikor ismét ugyanarra a web oldalra látogat az illető, akkor alkalmazásunk megkapja az itt tárolt adatokat automatikusan. Így eltárolhatunk például felhasználói nevet és jelszót, vagy azt az információt, hogy mikor járt utoljára nálunk a felhasználó, így ezeket a következő látogatáskor megtudhatjuk. Ennek a módszernek persze van egy nagy hátránya, mégpedig az, hogy számítógéphez és nem a tényleges személyhez kötött. Ha a felhasználónk egy másik számítógépről látogatja meg web helyünket, akkor nem kapjuk meg a már tárolt cookie-t és ugyanez a helyzet, ha mondjuk újratelepítette az operációs rendszerét a saját gépén, és ezzel a már összes tárolt cookie elveszett. Ennek ellenére sok esetben nagyon hasznos és jól használható technika.
A cookie fizikailag a C:\Documents and Settings\aktuális felhasználó\Cookies, illetve a C:\Windows\Cookies könyvtárban kap helyet operációs rendszer típusától függően. Ennek pontos helye lekérdezhető a rendszertől, ha esetleg szükségünk lenne rá. Ebben a könyvtárban számos TXT típusú állományt fogunk találni attól függően, hogy már hány olyan web helyet látogattunk meg, amely elhelyezett a gépünkön cookie állományt.
Nézzük, most miként tudunk saját webes alkalmazásunkkal elhelyezni ilyen állományt a kliens gépén, illetve hogyan tudjuk feldolgozni azt a következő látogatáskor.
Amikor tehát a kliens a böngészőjébe a mi URL címünket adja meg, akkor a gépe ellenőrzi, hogy ehhez a web helyhez van-e már cookie állomány tárolva, ha igen, akkor annak tartalmát is a kérés mellé csatolja. Így amikor a webes alkalmazásunk megkapja a kliens kérését, melyet a Request property-n keresztül kiolvashatunk, akkor ott már szerepelni fog a cookie állományok tartalma, így ezt rögtön feldolgozhatjuk.
Jelenítsük meg mondjuk az összes cookie adatát, melyet a kéréssel együtt kaptunk a web oldalon. Ehhez a Page osztály Load eseményét használjuk fel.
private void Page_Load(object sender, System.EventArgs e)
{
int i=0;
Label1.Text ="";
Itt egy foreach ciklussal végigmegyünk az össze cookie-n és kiírjuk azok adatait.
foreach (string s in Request.Cookies.AllKeys)
{
Label1.Text += "<span class=f9bu>" + (++i).ToString() + ". " + s + ":</span><br><br>";
Label1.Text += "<b>Value: </b>" + Request.Cookies[s].Value + "<br>";
...
}
}
A Request és a Response property-ben található Cookie property is HttpCookie típusú osztályt képvisel. Ez az alábbi tulajdonságokkal rendelkezik:
- Name – a cookie megnevezése
- Value – az eltárolt egyedi érték
- HasKeys – igaz, ha több kulcs és hozzá tartozó adat található a cookie-ban
- Values – az eltárolt egyedi értékek, ha nem csak egyet tároltunk el, akkor célszerű használni. Típusa NameValueCollection.
- Expires – a lejárat időpontja. Itt adható meg DateTime típusban, hogy a cookie meddig érvényes. Érvényesség lejárata után a cookie törölve lesz a felhasználó rendszeréből.
- Domain – a web site-unk, melyhez kötni szeretnénk a cookie-t.
- Path – a web site-on belüli elérési útvonal, melyhez kötni szeretnénk a cookie-t.
- Secure – biztonságos cookie, csak HTTPS protokoll esetén
Most már ki tudjuk olvasni az alkalmazásunkhoz kötött cookie-k adatait, de nézzük miként tudunk elhelyezni a felhasználó gépén egy új cookie-t.
private void Button1_Click(object sender, System.EventArgs e)
{
Random r = new Random();
A cookie nevéhez létrehozunk egy egyedi sztringet, melyet konstans szövegből és véletlenszerű számból generálunk.
string s = "SoftwareOnline_UserName_" + r.Next(int.MaxValue).ToString();
Ezt követően már létrehozhatunk egy HttpCookie típusú változót, melynek konstruktorában megadjuk a cookie elnevezését és annak értékét.
HttpCookie cookie = new HttpCookie(s, "micimackó");
Az Expires property-n keresztül megadjuk, hogy mennyi ideig legyen érvényes a cookie. Ezt most az aktuális időponthoz képest tíz órával későbbi időpontra választjuk.
cookie.Expires = DateTime.Now.AddHours(10);
A cookie-t a Response objektum Cookies property-n keresztül annak Add függvényével helyezhetjük el a kliensnek küldendő válaszunkban. Egy válaszhoz több cookie is rendelhető.
Response.Cookies.Add(cookie);
Response.Redirect("WebForm1.aspx");
}
Ezek után a felhasználó rendszerében létrejön a cookie állomány felhasználóinév@domainnév[x].txt névvel. Ennek tartalmát meg is tekinthetjük:
SoftwareOnline_UserName_1648441182
micimackó
localhost/
1024
592136192
29452273
1376789056
29452189
*
Nézzük most azt az esetet, amikor nem csak egy web site-hoz, hanem annak csak egy tetszőleges oldalához szeretnénk cookie-t kötni. Ezt valósítjuk meg a WebForm2.aspx lapon. Az itt elhelyezett cookie csak ehhez a laphoz tartozik, így ez a főoldalon, a WebForm1.aspx-en meg sem jelenik.
Itt egy olyan adatot helyezünk el, hogy mikor járt a felhasználó utoljára a WebForm2.aspx oldalon. Amikor legközelebb erre jár, akkor ezt az időpontot meg tudjuk mutatni számára.
Ehhez hasonlóan kell eljárnunk, mint az előbb csak azzal a különbséggel, hogy most használnunk kell a Cookie property Path property-jét is.
private void Page_Load(object sender, System.EventArgs e)
{
HttpCookie cookie = new HttpCookie("LastTime", DateTime.Now.ToString("G"));
cookie.Path = "/Page05/WebForm2.aspx";
cookie.Expires = DateTime.Now.AddDays(10);
Response.Cookies.Add(cookie);
Ha már el lett tárolva az utolsó időpont, akkor ennek értékét megjeleníthetjük a web oldalon a felhasználónk számára.
if (Request.Cookies["LastTime"] != null)
{
Label1.Text = Request.Cookies["LastTime"].Value;
}
}
Ekkor egy felhasználóinév@oldal[x].txt formájú cookie állomány jön létre, melynek lehetséges tartalma:
LastTime
2001. 11. 07. 16:05:10
localhost/Page05/WebForm2.aspx
1024
1075189504
29454201
2550279056
29452189
*