Herkesin 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.



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

T
am 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. 

Protected Sub Oku_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Oku.Click
   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, _

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

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, _

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

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, _

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

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

   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

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

kurabiye_nesne = New HttpCookie("ilk_kurabiye")

Ş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, _

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

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

   Dim kurabiye_nesne As HttpCookie

   kurabiye_nesne = Request.Cookies(0)

   ListBox1.Items.Add(kurabiye_nesne.Name)

   ListBox2.Items.Add(kurabiye_nesne.Value)

End Sub

Etiketler : ASP.NET, Cookie