Belli bir zaman aralığındaki durumdur. Bu durumu takip etmek ve yönetmek session tracking, session management.
Http stateless bir protokoldür, yollanan her istek farklı bir kullanıcı gibi yollanır. 2 defa istek yollayan bir kişinin aynı kişi olup olmadığı session tracking ile takip edilir. Cookie, url vs ile takip sağlanabilir.
Cookie
- Persistent, non-persistent olabilir. non-persistent tarayıcı kapanınca silinir.
- Tarayıcı ayarlarınca cookie disabled olursa cookie ile session tracking yapılamaz (gmail, facebook gibi siteler de cookie'siz çalışmıyor).
- Cookie'ler sadece text formatında olur.
- name, value, comment, path, version, max-age vs bilgiler tutulur.
- javax.servlet.http.Cookie ile cookie işlemleri yapılabilir.
- Cookie eklemek için: HttpServletResponse.addCookie(new Cookie())
- Cookie okumak için: HttpServletResponse.getCookies()
- Cookie silmek için cookie.setMaxAge(0), HttpServletResponse.addCookie(cookie)
- Kullanım Alanları:
- Yetkilendirme sistemi
- Kullanıcı takibi
- Tema vs özelleştirmeler
URL Rewriting
- qwerty.com/page?id=123 şeklinde url olarak parametre yollanabilir. google.com/search?q=google şeklinde arama yaparken arama kelimesini parametre olarak url ile gönderebiliyoruz.
- HttpServletRequest tipindeki nesne getParameter(String) metodu içerir. Bu metod ile okuma yapılır.
HttpSession
- Cookie'ler kullanıcı tarafında görüntülenebilir, bu yüzden önemli bilgileri server tarafında tutup cookie ile bu bilgilerin id'si yollanır. Bu iş HttpSession tarafından halledilir.
- HttpSession oluşturulduğu zaman bir session nesnesi oluşur, bu session nesnesinin içine bilgi eklemek istersek session.setAttribute("deneme", "bu bir bilgidir"), okumak istersek session.getAttribute("deneme") şeklinde okuma ve yazma yapabiliriz.
- HttpSession'u kullanabilmek için HttpServletRequest tipindeki request nesnesinin getSession() fonksiyonu kullanılır.
doGet(HttpServletRequest request, ...){... HttpSession session = request.getSession() ...}
- request.getSession() eğer session varsa session döndürür, session oluşturulmamışsa yeni session oluşturur ve o session'u döndürür.
- Sadece session oluşturulup oluşturulmadığını öğrenmek için request.getSession(false) kullanılır.
- Oluşturulan session'u silmek içinse session.invalidate() metodu kullanılır (ör. çıkış yapmak).
- Session oluşturulduğu zaman bir id değeri belirlenir ve bu id değeri cookie ile tarayıcıya yollanır.
- Yollanan cookie non-persistent'tir yani tarayıcının kapatılması, cookilerin temizlenmesi vs durumlarında silinir. Eğer kullanıcı bilgilerinin tutulması vs. bu yolla yapılıyorsa kullanıcı tarayıcıyı her kapatıp açmasında yeniden giriş yapması gerekecektir.
- Session ile ilgili daha fazla bilgi ve session'ı persistent yapmaya yönelik şu link var: Stackoverflow. Çözümü özetlemek gerekirse:
- Bir context listener oluşturulur. Bu listener sayesinde web uygulaması açıldığında, kullanıcı session bilgilerini tutacak olan bir hashmap oluşturulur.
- Sonrasında bir HttpSessionListener oluşturulur. Bu listener ile her bir session oluşturulduğunda session bilgisini aktif kullanıcılar listesine ekleriz.
- Kullanıcı girişini tutmak için ayrıca bir kalıcı cookie tutmak gerekiyor.
- Bu kalıcı cookie varsa kullanıcı bilgilerine bakarız, bu bilgiler aktif kullanıcıların içinde tutulur (context içinde), sonrasında duruma göre yeniden giriş yapmaya veya profil sayfasına yönlendirilir.
- Eğer kalıcı cookie yoksa yeni bir cookie oluşturup cookie değeri olarak session id verilir ( request.sessionId() )
- Yukarıdaki stackoverflow linkinden yönlendirilen sayfada java 8 sonrasında gelen HttpAuthenticationMechanism ve @RememberMe annotation'ı ile nasıl çözüleceği anlatılıyor: Stackoverflow 2
0 yorum:
Yorum Gönderme