ASP.NET'te Cookie'ler(*)

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 Cookie dosyalarının bilgisayarına 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.

 

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

 

* Meraklısı İçin Notlar

Her ne kadar bu makalede Cookie'ler her yönü ile anlatılmamış olunsa bile bu makaleyi okuyanların Türkiye'de yayınlanmış ASP.NET konulu kitaplardan Cookie'ler hakkında ek birşeyler bulma ihtimalleri çok düşüktür. Çünkü kitaplarda bu kadar bilgi bile yoktur.

 

 

Visual Basic 9.0 Kitabı

 

Daha kapsamlısı yoktur,

Daha kolay okunanı yoktur

Bu kadar ileri düzey bilgi içeren başka bir Visual Basic kitabı yoktur.

 

 

.NET uyumlu Visual Basic programlama dilini öğrenmek, eksik bilgilerinizi tamamlayıp Visual Basic uzmanı olmak isteyenler için dünyanın en iyi kitaplarından birisi Memik YANIK tarafından Türkçe olarak hazırlandı. Kitaptan alınıp aşağıda linki verilen bölümü incelediğinizde bize hak vereceksiniz.

 

http://www.memikyanik.net/application-sinifi-ve-visual-basic-projeleri-makalesi/30.aspx

 

Peşinen söyleyelim bu kitapla ilgilenenlere fikir versin diye web’de yayınlanan bu bölümde verilen bilgileri yerli kaynakların hiç birinde, yabancı kaynakların büyük bir çoğunluğunda bulamazsınız. Kitap hakkında ayrıntılı bilgiyi aşağıda linki verilen makalede bulabilirsiniz.

 

http://www.memikyanik.net/visuan-basic-90-kitabim-hakkinda-yazisi/29.aspx

 

Bu kitabı edinmek istiyorsanız aşağıda verilen adresten temin edebilirsiniz.

 

http://www.hepsiburada.com/visual-studio-2008-ile-microsoft-visual-basic-9.0/productDetails.aspx?categoryid=211651&productid=kseckin0001