Memik Yanık - Kişisel Web Sitesi Ana Sayfa | Hakkımda | Kitap Önerileri | Fotoğraflarım | RSS RSS | İletişim

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 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, ByVale As EventArgs) Handles Me.Load
   Dim kurabiye_nesne As HttpCookie
   kurabiye_nesne = New HttpCookie("ilk_kurabiye")
EndSub

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, ByVale 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"
EndSub

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.

ProtectedSub Page_Load(ByVal sender As Object, ByVale 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"
EndSub

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. 

ProtectedSub Page_Load(ByVal sender As Object, ByVale 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)
EndSub 

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, ByVale 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
EndSub

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. 

ProtectedSub Page_Load(ByVal sender As Object, ByVale 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)
EndSub

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")
  Dimtakimlar 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)
EndSub

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, ByVale As System.EventArgs) Handles Oku.Click
   Dim okuma_kurabiye As HttpCookie
   okuma_kurabiye = Request.Cookies("ilk_kurabiye")
EndSub

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, ByVale 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)
EndSub

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, ByVale 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)
EndSub

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, ByVale 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
EndSub

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
EndSub

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
HttpCookienesnesi 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, ByVale 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)
EndSub

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, ByVale 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)
EndSub

* 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

ASP.NET 04.08.2009 19:26:10

YORUM YOK


YorumlarYorum Yaz
Ana Sayfa | Hakkımda | Kitap Önerileri | Fotoğraflarım | RSS | İletişim
Memik Yanık 2004-2009 © Tüm Hakları Saklıdır.
Hazırlayan www.semgoksu.com