HTTP stateless bir protokoldür. Yani tarayıcı üzerinden gönderilen her istek birbirinden bağımsızdır. Bu da sunucular için iyi bir ölçeklenebilirlik sağlar. Aynı tarayıcıdan bile olsa isteklerin birbirlerinden haberleri yoktur. Bu yöntem, avantajlarının yanında bazı web uygulamaları için dezavantaja dönüşebilir. Örneğin bir alış veriş sitesinde gezerken beğendiğimiz ürünleri sepete atmak isteriz. Fakat sunucunun, isteklerin aynı kullanıcıdan geldiğini bilmesi gerekir.
Java EE ortamındaki web sunucuları, her son kullanıcının kendi verisini saklayabilmesi için mekanizmalar geliştirmiştir. HttpSession API bu mekanizmalardan birisidir.
Aslında son kullanıcının verileri saklayabildiği 4 tane ortam vardır.
1- page scope
2- request scope
3- session scope
4- application scope
Herbir ortamın verileri set edecek setAttribute() ve set edilen nesneleri geri alacak getAttribute() metotları vardır.
1- page scope : Adından da anlaşılabileceği gibi page scope sayfa değişkenlerini saklayabildiğimiz bir alandır. Örneğin Servlet sınıflarında yaratılan lokal değişkenler ya da bir JSP sayfasındaki hidden input değerleri bu alanda tutulurlar.
2- request scope : Yapılan istek bazında veri saklamak için kullanılan bir alandır. Örneğin veri tabanına sorgu çekip gelen kayıtları web sayfasında gösteren bir uygulamamız olsun. Kayıtları alarak sayfaya yönlendirme yapan bir Servlet sınıfı düşünün. Veri tabanı işlemleri tamamlandıktan sonra gelen cevabı sayfaya yönlendirmeden önce kayıtların da yönlendirilecek sayfaya bir şekilde aktarılması gerekir. Bunun için request scope kullanılabilir. HttpServletRequest tipindeki nesne üzerinden setAttribute() – getAttribute() metotları kullanılarak nesneler bu alanda tutulabilir.
3- session scope : Bir kullanıcının yapmış olduğu tüm istekler için geçerli olan bir ortamdır. Yazının başında belirttiğim HttpSession nesnesi sayesinde session scope kullanılabilir. HttpSession nesnesine, HttpServletRequest nesnesi üzerinden getSession() metodunu çağırarak erişebiliriz.
getSession() metodu boolean tipte parametre alır. true gönderildiğinde eğer kullanıcı için daha önceden bir session nesnesi oluşturulmuşsa o nesne döner. Oluşturulmamışsa yenisi yaratılarak döndürülür. false gönderildiğinde eğer kullanıcı için daha önceden bir session nesnesi oluşturulmuşsa o nesne döner. Oluşturulmamışsa null döndürülür. Yenisi yaratılmaz. Daha çok true parametre gönderildiğinden bu metot overload edilmiş ve parametre almayan çeşidi yazılmıştır. Parametre almayan getSession() metodu true parametre alan ile aynı işi yapar.
Session ‘da bir nesne saklamak için setAttribute() metodu kullanılır. Daha sonra session’da saklanan nesneye getAttribute() metodu ile erişilebilir.
Örneğin yazdığımız web uygulamasında kullanıcının giriş yaptığı, kullanıcı adı ve parola soran bir ekranımız var. Kullanıcı sisteme bir defa girdikten sonra erişebildiği her sayfada ismini yazdırmak istiyoruz. Giriş yapıldığı anda kullanıcı bilgilerini session scope’da saklarsak daha sonra erişmek istediğimiz sayfalardan getAttribute() metodu ile erişebiliriz. Uygulamamız sonlandıktan sonra ya da kullanıcı sistemden çıkış yaptığında session nesnesini kapatmak gerekir. Bunun için invalidate() metodu kullanılır. Bir session nesnesi invalidate() edildikten sonra içerisinde saklanan tüm nesneler referanslarını kaybeder.
Session kapatma işlemleri birkaç farklı şekilde yapılabilir.
Örneğin invalidate() metodunu çağırmak bu yöntemlerden biridir.
Bir diğeri ise session üzerinden setMaxInactiveInterval(int) metodunu çağırmaktır. Herhangi bir Servlet sınıfında session nesnesine erişerek bu metodu çağırırken parametre olarak saniye cinsinden int tipinde değer gönderilir. Gönderilen değer süresince istek gelmezse session invalidate() edilir.
Bunun dışında uygulamanın konfig dosyasına session timeout süresi dakika cinsinden verilerek set edilebilir. Aynı şekilde konfig dosyasında (web.xml) verilen bu süre zarfında istek gönderilmediğinde session invalidate edilir.
[codesyntax lang=”java” lines=”no”]
<session-config>
<session-timeout>30</session-timeout>
</session-config>
[/codesyntax]
4- application scope : Tüm uygulama bazında yaratılan bir geçerlilik bölgesidir. Bu bölgeye tüm Servlet sınıfları istedikleri zaman erişebilir. Application Scope’a set edilmek istenen değişkenler uygulamanın konfig dosyasında tanımlanabilir. Servlet sınıflarından da ServletContext nesnesi üzerinden bu bölgedeki değişkenlere erişilebilir.
[codesyntax lang=”java” lines=”no”]
<context-param>
<param-name>isim</param-name>
<param-value>erkin</param-value>
</context-param>
<context-param>
<param-name>parola</param-name>
<param-value>denemeParola</param-value>
</context-param>
[/codesyntax]
Geçerlilik bölgeleri ile işlemler yaparken ihtiyaçlar iyi bir şekilde analiz edilmelidir. Sunucunun hafızasını güzel kullanmak adına gerekmedikçe session oluşturulmamalı, uygulama ortamında değişkenler saklanmamalıdır.