ASP.NET'te Cookie'ler
6/8/2009Herkesin bildiği gibi kurabiyeler genellikle istemci bilgisayarda kullanıcı hakkında bilgi içeren text dosyalarıdır. Aşağıda verilen ekran görüntüsünde fark edeceğiniz gibi ziyaret edilen çok sayıda site istemci bilgisayarda Cookie hazırlamaktadır. Windows Vista’da kullanıcılara ait Cokies klasörü farklı bir yerdedir. Cookie dosyaları kolaylıkla okunabildiği için önemli bilgileri içermeleri önerilmiyor. Tarayıcı programına göre değişmekle birlikte Cookie dosyaları en fazla 4 KB boyutuında olabilmektedir. Protected Sub Oku_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Oku.Click ByVal e As EventArgs) Handles Oku.Click Dim okuma_kurabiye As HttpCookie okuma_kurabiye = Request.Cookies("ilk_kurabiye") Dim deger As String deger = okuma_kurabiye("01") ListBox1.Items.Add("01") ListBox2.Items.Add(deger) End Sub ByVal e As System.EventArgs) Handles Oku.Click Dim okuma_kurabiye As HttpCookie okuma_kurabiye = Request.Cookies("ilk_kurabiye") Dim deger As String deger = okuma_kurabiye.Item("01") ListBox1.Items.Add("01") ListBox2.Items.Add(deger) End Sub ByVal e As EventArgs) Handles Oku.Click Dim okuma_kurabiye As HttpCookie okuma_kurabiye = Request.Cookies("ilk_kurabiye") Dim iller As New System.Collections.Specialized.NameValueCollection() iller = okuma_kurabiye.Values Dim sayi As Integer = iller.Count For i As Integer = 0 To sayi - 1 Dim anahtar, deger As String anahtar = iller.Item(i) deger = iller.Keys(i) ListBox1.Items.Add(anahtar) ListBox2.Items.Add(deger) Next End Sub If Request.Cookies("ilk_kurabiye") IsNot Nothing Then Response.Write("Bu Cookie istemcide vardır") Else Response.Write("Bu Cookie istemcide yoktur") End If End Sub kurabiye_nesne = New HttpCookie("ilk_kurabiye") ByVal e As EventArgs) Handles Me.Load Dim kurabiye As HttpCookie kurabiye = New HttpCookie("Takim", "Fenerbahçe") Dim expire_zamani As DateTime = Now.AddDays(30) kurabiye.Expires = expire_zamani Response.Cookies.Add(kurabiye) End Sub Dim kurabiye_nesne As HttpCookie kurabiye_nesne = Request.Cookies(0) ListBox1.Items.Add(kurabiye_nesne.Name) ListBox2.Items.Add(kurabiye_nesne.Value) End Sub
Bu ekran görüntüsünü dikkatlice incelerseniz bazı kurabiye dosyalarının adında 1, bazıların adında ise 2 ekinin olduğunu fark ederseniz. Ayrıca kurabiye dosyalarının adının @’ten öncesi geçerli kullanıcının adı iken @’ten sonra kurabiye dosyasını hazırlayan sitenin adıdır. Bu bölümü yazarken kullandığım bilgisayarda kullanıcı adı “memik” ve siteyi localhost olarak test ettiğim için hazırlanacak kurabiye dosyasının adı memik@loocalhost.txt olur. Hemen hatırlatmak gerekir ki kullanıcı Browser programından yararlanıp bilgisayarına Cookie dosyalarının yazılmasını engellemiş olabilir.
Geliştirdiğiniz Web siteniz dahilinde Cookie dosyası hazırlayıp istemci bilgisayara kullanıcıyla ilgili bilgiler aktarmak istiyorsanız System.Web’deki HttpCookie sınıfından yararlanmaniz gerekir. Bu sınıfın örneğinin nasıl alındığını aşağıda görebilirsiniz.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
End Sub
Bu kodda HttpCookie sınıfının tek parametreli yapıcı metodunu kullandım. Bu sınıfın 2 parametreli yapıcı metodunun nasıl kullanıldığı hakkında bilgi konunun devamında verilecektir. Yapıcı metoda parametre olarak verilen string bilgi istemci bilgisayarda hazırlanacak dosyanın içine yazılmakta ve daha sonra bu dosyadan okuma yapılırken bu parametreden yararlanılmaktadır. Başka bir anlatımla buradaki “ilk_kurabiye” Cookie dosyasında hazırlanacak Cookie’nin adıdır.
Bu şekilde HttpCookie nesnesi hazırladıktan sonra sırada istemci bilgisayarın diskine yazılmak üzere bu nesneye bilgi aktarmak var. HttpCookie nesnesinde anahtar-değer şeklinde düzenlenmiş bilgiler Values koleksiyonunda saklanmaktadır. Bu koleksiyona eleman ekleme işlemini aşağıdaki gibi yapmak mümkündür.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
kurabiye_nesne.Values("01") = "Adana"
kurabiye_nesne.Values("02") = "Adıyaman"
End Sub
HttpCookie sınıfının Values koleksiyonu indekslendiği için bu koleksiyona eleman ekleme işlemini aşağıdaki gibi yapmak mümkündür. Başka bir deyişle istemci bilgisayara yazılacak bilgileri HttpCookie nesnesine eklerken koleksiyon adı belirtmek şart değildir.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
kurabiye_nesne("01") = "Adana"
kurabiye_nesne("02") = "Adıyaman"
End Sub
Konunun iyice anlaşılması için önce ayrı bir koleksiyon nesnesi hazırlayıp bu nesneye anahtar-değer şeklinde düzenlenmiş bilgileri ekleyip sonra bu koleksiyon nesnesini HttpCookie nesnesinin Values özelliğine aktaracağım. Bu işlemi nasıl yaptığımı aşağıda görebilirsiniz.Values koleksiyonu gerçekte NameValueCollection tipinde bir nesne olduğu için NameValueCollection sınıfının örneğini alıp Add() metodu ile anahtar-değer şeklinde düzenlenmiş bilgileri bu koleksiyon nesnesine ekledim.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
Dim iller As New System.Collections.Specialized.NameValueCollection()
iller.Add("01", "Adana")
iller.Add("02", "Adıyaman")
kurabiye_nesne.Values.Add(iller)
End Sub
Bu şekilde HttpCookie nesnesinde saklanacak bilgiler tespit edildikten sonra sıra istemcinin bilgisayarında Cookie bilgisini içeren dosyanın ne kadar süre saklanacağını tespit etmeye gelir. Bu işlem için HttpCookie nesnesinin Expries özelliği aşağıdaki gibi ayarlanabilir. HttpCookie nesnesinin Expires özelliği ayarlanmazsa Cookie hazırlanır ama istemci bilgisayara kaydedilmez ve kullanıcı browser penceresini kapattığında bu Cookie silinir.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
Dim iller As New System.Collections.Specialized.NameValueCollection()
iller.Add("01", "Adana")
iller.Add("02", "Adıyaman")
kurabiye_nesne.Values.Add(iller)
Dim silme_zamani As DateTime = Now.AddDays(15)
kurabiye_nesne.Expires = silme_zamani
End Sub
HttpCookie nesnesinin Exprires özelliğini ayarlamak üzere tanımladığım değişkene silme_zamani adı verirken tereddüt etmedim değil; zira silme_zamani’nı değişken adı olarak kullanma hakkı(!) programcılık kitapları yazan yerli bir yazara çok önceden geçmiş olabilir.
Bu ayarlama sayesinde Cookie bilgileri istemcinin bilgisayarında 15 gün boyunca saklanır. Başka bir deyişle Expires özelliği 15 gün sonraki tarih olan bu sitenin hazırladığı Cookie bu site 15 gün boyunca ziyaret edilmezse Cookie dosyası siliniyor. Expires özelliği DateTime tipinde olduğu için burada yapıldığı gibi geçerli tarihe AddDays() metodu ile gün eklemek yerine sahip bir tarihi bu özelliğe aktarabilirsiniz.
Şimdi sırada bu HttpCookie nesnesini istemcinin bilgisayarına yazmak var. Bu işlem için HttpResponse sınıfının yani Page sınıfının bir özelliği durumunda olan Responce nesnesinin Cookies koleksiyonuna hazırladığınız HttpCookie nesnesini Add() metodu ile eklemek gerekmektedir. Bu metodun nasıl kullanıldığını, başka bir deyişle istemcide nasıl Cookie dosyası hazırlandığını aşağıda görebilirsiniz.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
Dim iller As New System.Collections.Specialized.NameValueCollection()
iller.Add("01", "Adana")
iller.Add("02", "Adıyaman")
kurabiye_nesne.Values.Add(iller)
Dim silme_zamani As DateTime = Now.AddDays(15)
kurabiye_nesne.Expires = silme_zamani
Response.Cookies.Add(kurabiye_nesne)
End Sub
Tam bu noktada istemcinin bilgisayarına geçerli kullanıcıya ait Cookies klasöründe text dosya hazırlamak için bütün hazırlıkları tamamlamış olduk. Aşağıda verilen ekran görüntüsünü sayfayı açıp bu kodun işletilmesini sağladıktan sonra aldım. 
Yukarıda da işaret edildiği gibi Cookie dosyaları text dosyaları oldukları için kolaylıkla okunabilir. Bu nedenle önemli bilgilerin Cookie dosyalarına yazılması önerilmiyor. Hazırladığım bu Cookie dosyasının içeriğini aşağıda görebilirsiniz.
Yukarıda işaret edildiği gibi hazırladığım kod sayesinde istemcinin bilgisayarında oluşturulan text dosyasının adına “1” eklendi. Bu 1’in anlamı şudur: Bu cookie dosyasında bir HttpCookie nesnesine ait bilgiler bulunmaktadır. Başka bir deyişle buradaki 1’in anlamı Response nesnesinin Cookies koleksiyonuna Add() metodu ile bir HttpCookie nesnesinin eklenmiş olmasıdır. Bir Cookie dosyasında birden fazla HttpCookie nesnesinin içeriğinin yazılabildiğini göstermek için yukarıda verdiğim kodu ekleme yaptım.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
Dim iller As New System.Collections.Specialized.NameValueCollection()
iller.Add("01", "Adana")
iller.Add("02", "Adıyaman")
kurabiye_nesne.Values.Add(iller)
Dim silme_zamani As DateTime = Now.AddDays(15)
kurabiye_nesne.Expires = silme_zamani
Response.Cookies.Add(kurabiye_nesne)
Dim takimlar_cookie As HttpCookie
takimlar_cookie = New HttpCookie("ikinci_kurabiye")
Dim takimlar As New System.Collections.Specialized.NameValueCollection()
takimlar.Add("FB", "Fenerbahçe")
takimlar.Add("GS", "Galatasaray")
takimlar.Add("BJK", "Beşiktaş")
takimlar_cookie.Values.Add(takimlar)
Dim expire_zamani As DateTime = Now.AddDays(30)
takimlar_cookie.Expires = expire_zamani
Response.Cookies.Add(takimlar_cookie)
End Sub
Bu kod işletildiğinde hazırlanacak Cookie dosyasının adına “2” eklenir ve 2 HttpCookie nesnesinin Values koleksiyonun içeriğine sahip olur.
Cookie Dosyasından Okuma Yapmak
Ne zaman Cookie içeren text dosyasından okuma yapmak istediğinizde yine HttpCookie nesnesi hazırlamanız gerekir. İstemcinin bilgisayarındaki text dosyasından nasıl okuma yapıldığını anlatmak için sayfaya 2 Listbox yerleştirip aşağıda verdiğim kodu yazdım.
Dim okuma_kurabiye As HttpCookie
okuma_kurabiye = Request.Cookies("ilk_kurabiye")
End Sub
Bu kod sayesinde istemcinin bilgisayarındaki Cookie dosyasının içeriğinin “ilk_kurabiye” ile ilgili elemanı Request nesnesinin Cookies koleksiyonundan okunup hazırlamış olduğumuz HttpCookie nesnesine aktarılır. Şimdi sırada bu HttpCookie nesnesindeki anahtar-değer şeklinde düzenlenmiş bilgileri okumak var. Bu amaçla bu koda aşağıdaki gibi ekleme yaptım.
Aşağıda verdiğim kodda kullandığım “deger” adlı değişken 2004 yılında ilk C# kitabımı yazarken adını çaldığım(!) önemli değişkenlerden birisidir. Yani anahtar-değer şeklinde düzenlenmiş bilginin değer kısmına “deger” adını vermekle aslında suç işlemiş(!) oluyorum. Umarım okurlarını zirvelere çıkarmayı kendisine şiar edinmiş ünlü programcılık kitabı yazarımız bu metni okumaz veya kimse “Memik Yanık senin gül değişkeninin adını makalesinde kullanmış ama sen hala burada oturuyorsun” diye ihbarda bulunmaz.
Protected Sub Oku_Click(ByVal sender As Object, _
Bu kod sayesinde anahtar bilgisi “01” olan elemanın değer bilgisi okunup ikinci ListBox’a aktarılır. Burada okuma işlemi gerçekte(aslında aynı zamanda) HttpCookie nesnesinin Items koleksiyonundan yapıldığı için daha doğrusu HttpCookie sınıfının Items koleksiyonu da indekslendiği için bu kod aşağıdaki gibi düzenlenirse aynı sonuç alınır.
Protected Sub Oku_Click(ByVal sender As Object, _
HttpCookie sınıfının Items koleksiyonu biraz da geriye doğru uyumluluğu sağlamak için vardır. Bu nedenle Items yerine Values koleksiyonunu kullanmanız önerilir. Konu üzerinde düşünmenizi sağlamak için aşağıda verdiğim kodu yazdım. Bu kod sayesinde ilk_kurabiye adını verdiğim HttpCookie nesnesinin bütün elemanları okunur ve anahtarları ilk ListBox’a değerleri ise ikinci ListBox’a yazılır. Alışkanlıklarımdan bir türlü vazgeçemiyorum ve aşağıda verdiğim kodda kullanım hakkı yerli bir yazarda olan ve değişken adı olarak kullanılması suç teşkil eden “i” ve sayi’yı değişken adı olarak kullanmışım.
Protected Sub Oku_Click(ByVal sender As Object, _
Yukarıda işaret edildiği üzere HttpCookie sınıfının Values özelliği gerçekte NameValueCollection tipindedir. Bu nedenle önce NameValueCollection tipinde bir nesne hazırladım sonra okuma yapmak üzere hazırladığım HttpCookie nesnesinin Values özelliğini bu nesneye aktardım.
Okuma yapmak istediğiniz Cookie’nin varlığını araştırmak istiyorsanız aşağıdaki gibi kod yazabilirsiniz. Burada yapılan Request nesnesinin Cookies koleksiyonda ilgilenilen elemanın yani Cookie’nin olup olmadığını araştırmaktır.
Protected Sub Oku_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Oku.Click
Benzer şekilde Cookie dosyasındaki ikinci grup bilgi içinde HttpCookie nesnesi hazırlanıp okuma yapılabilir. Başka bir deyişle aşağıdaki gibi bir HttpCookie nesnesi hazırlanıp bu nesne sayesinde Cookie dosyasındaki ikinci grup bilgileri okumak mümkündür.
HttpCookie Sınıfının 2 Parametreli Yapıcı Metodu
Cookie’ler ve HttpCookie sınıfıyla ilgili olarak ilk yaptığımız işlemde HttpCookie sınıfının bir parametreli yapıcı metodunu kullanıp aşağıdaki gibi HttpCookie nesnesi hazırlamıştık. Ayırca bu sınıfın 2 parametreli yapıcı metodundan daha sonra söz edeceğimizi işaret etmiştik.
Dim kurabiye_nesne As HttpCookie
Şimdi ise HttpCookie sınıfının 2 parametreli yapıcı metodundan yararlanıp HttpCookie nesnesi hazırlayacağım. İkinci parametre tıpkı 1. parametre gibi string tipindedir.
Protected Sub Page_Load(ByVal sender As Object, _
Bu kod işletildiğinde istemci bilgisayarda yine bir Cookie dosyası hazırlanır bu dosyada "takim" adında bir Cookie ve anahtar-değer olarak yalnızca “Fenerbahçe” bilgisi yazılır. Başka bir deyişle Request nesnesinin Cookies koleksiyonunda bu elemanın bir adı olmaz. Bunu text dosyayı inceleyerek görebilirsiniz.
Şimdi bu dosyadaki anahtar-değer çiftini okuyacağım. Bu amaçla aşağıda verdiğim kodu yazdım. Bu amaçla HttpCookie tipinde değişken tanımlayıp Request nesnesinin Cookies koleksiyonun ilk elemanını bu değişkene aktardım.
Protected Sub oku_Click(ByVal sender As Object, ByVal e As EventArgs) Handles oku.Click