HttpSession & URLRewriting

Merhaba arkadaşlar, bu yazımda HttpSession arayüzünün methodlarına ve URLRewriting tekniğine değinmeye çalışacağım.

Bir önceki yazımda da ifade ettiğim gibi Contaıner;

  •  Session id oluşturur.
  • Cookie objesi oluşturur.
  • Cookie objesine session id’yi ekleme.
  • Response bilgisine cookie ekleme.

Gibi görevleri yapmaktaydı. Kısa bir hatırlatıcı bilgiden sonra HttpSession arayüzünü nasıl kullanacağımıza bakalım;

Servlet içerisinde HtppSession objesini şu şekilde alabiliriz;

getSession methodu her zaman HttpSession objesi döndürür.

Overloaded edilmiş şekli de mevcuttur;

* boolean parametre alan getSession methodu ise request sesison’a sahip ise HttpSession objesi döner, sahip değilse null döner. Bazı durumlarda yeni session oluşturmak istemezsiniz, bir önceki session’u almanız gerekebilir. Bu durumda overloaded edilmiş getSession methoduna false parametre geçirerek bunu yapabilirsiniz.

Bu şekilde HttpSession objemizi istedğimiz yerde alabiliriz. Contaıner’ın sorumluluklarını görebilmemiz için güzel bir örnek. Dikkat ederseniz şunları yapmadık;

  • new HttpSession gibi bir obje oluşturmadık.
  • Unique Session ID oluşturmadık.
  • new Cookie gibi bir obje oluşturmadık.
  • Session ID ile Cookie objesini ilişkilendirmedik.
  • Cookie objesini response’a eklemedik.

Bunlar Contaıner’ın görev ve sorumluluğundadır.

HttpSession objesini request üzerinden request.getSesssion() methodu ile alıyorduk. Bu noktada şu soru aklınıza gelebilir; Session objesini ServletContext üzerinden yada başka şekilde de alabilirmiyiz?

Bu sorunun cevabı evet’dir. Alınabilir. Ama tavsiye edilmez

Şunu düşünelim; request üzerinden session aldığımızda contaıner’a aslında ben “bu” request için session istiyorum. Çünkü session , request tarafından tanımlanır. Session objesini session event objesi üzerinden de alabiliriz. Önceki yazılarımda anlattığım Listener class’lar sayesinde session obesini alabiliriz. Listener class’ların servlet yada jsp olmadığını da unutmayalım.

Şu şekilde HttpSessionListener interface’sini implemente eden listener class ile alabiliriz;

Örnek uygulama;

index.jsp

 LoginServlet.java

login.jsp 

* login.jsp kafanızı karıştırmasın. Jsp yazılarında bu konulara değineceğim. Sadece session üzerindeki attribute’ları aldığımızı bilelim şimdilik.

2015-03-09 13:14:49 2015-03-09 13:14:19

2015-03-09 13:28:04

2015-03-09 13:15:06

HttpSession methodlarına bakalım;

  • String getId() : Unique Session ID bilgisini döner.
  • Object getAttribute(String name) : Session üzerine eklenmiş objeyi return eder. Yok ise  null döner.
    getAttributeNames() , removeAttributes(String name), setAttribute(String name, Object object) methodları da aynı mantıkla çalışır.
  • long getCreationTime() : Sessionun oluşturulma zamanını döner. 1 Ocak 1970 tarihine göre milisecond olarak döner.
  • boolean isNew() : Session’un ilk kez oluşturulmuş mu kontrolünü gerçekleştirir.
  • void invalidate() : Session oturumunubitirir.

NOT : Session süresini web.xml içerisinden de ayarlayabiliriz. Tomcat için bu süre default olarak 30 dk’dır. Deployment Descriptor içerisine şunu ekleyerek 15 dk ya çekelim süreyi;

 NOT 2 : getMaxInactiveInterval( ) methodu sn cinsinden session timeout süresini döndürür. 15 dk için 900 sn döndürecektir.

URL Rewriting

Browser’ın cookie özelliği kapalı ise session bilgisini cookie üzerinden taşıyamayacağız. Bu durum göz önüne alınarak URL Rewriting tekniği geliştirilmiştir. Url rewriting tekniği her durumda çalışır

Temel mantık;

2015-03-09 14:00:49

* Her link’in sonuna session id eklenerek unique link’ler oluşturulmuş olur. Kullanıcı bu linkleden birine tıkladığında Contaıner extra veriyi alarak Session ile match eder.

Bu tekniği kullanmak için url encoding işlemi yapacağız. Url rewriting işlemini, cookie disable olduğunda kullanmalıyız.

Explicit(açık) olarak url encode yapmaz isek ve cookie disable ise browserda bu durumda session bilgisini alamayız. Eğer url encode yapmış isek Contaıner ilk olarak cookie kullanmayı deneyecektir. Eğer cookie kapalı ise url rewriting yaklaşımını tercih edecektir.

2015-03-09 14:03:39 2015-03-09 14:03:48

 

Url Rewriting;

Browser üzerinden cookie disable edelim ve  login.jsp sayfasına gidelim;

2015-03-09 14:27:26

index.jsp safyasını atlayarak geldiğimiz için CaySever yerine null yazıyor ona takılmayalım

Session id bilgisini görebildik sanırım , cookie disable olmasına rağmen session bilgisini url üzerinden taşıdık.

NOT : Contaıner, cookies’in çalışıp çalışmadığı ile ilgilenmez. Yani contaıner cookinein çalışıp çalışmadığını nasıl anlar sorusu doğru bir soru değil. Contaıner , her zaman cookie bilgisini gönderir ve url rewriting işlemini yapar. Contaıner, getSession methodunu çağırır. Eğer session id gelmezse yeni bir session oluşturur. Bu noktada Contaıner, cookienin çalışıp çalışmadığını bilmez. İlk response döndüğünde cookie ve Url rewriting tekniği beraber dener.

Session id , request param olarak ve request header içerisinde kullanılması doğru değildir. Ya cookie header içerisinde olmalı yada url rewriting ile url sonuna eklenmelidir.

2015-03-09 14:37:30

Önemli noktalar;

  • Url Rewriting işlemi, session id bilgisini url’in sonuna ekler.
  • Session id bilgisi request url içerisinde extra bilgi olarak gelir. Örn; url+sessionID
  • Eğer cookie disable olursa URL Rewriting işlemi otomatik olarak gerçekleşir. Ancak explicit olarak encode işlemi yapılmalıdır.
  • URL rewriting işlemi static sayfalar için değil dinamik sayfalar için yapılmalıdır.

 

Yazımı burada sonlandırıyorum arkadaşlar.

Bir sonraki yazıda görüşmek üzere.

Kaynak Kodlar : HttpSession & URLRewriting

Mutlu kalın ve bol bol Çay için

~ Alican Akkus

 

1097 Total Views 1 Views Today