26 Mart 2015 Perşembe

HTTP Session

HTTP session nedir?


HTTP protokolü ve web serverlar stateless olduğundan, state bilgisini tutamazlar.
Yapılan her server-client konuşmasına bir id verilerek, her request ve response bu id ile etiketlenerek, state bilgisinin tutulması, yani serverin client'ı hatırlaması sağlanır.
Bu konuşma bir HTTP session'dır.
Bu işlemin yönetilmesine de HTTP session mangement denir.

HTTP session management yöntemleri


1. Kullanıcı adı ve şifresi kombinasyonunu gönderme

Kullanıcının girdiği kullanıcı adı ve şifre bilgisini sever-client arasındaki her request-response mesajında gidip gelmesidir.
Etkili bir yöntem değildir. Çünkü aynı kullanıcı farklı bir tarayıcıdan da giriş yapmak istediğinde işe yaramaz.

2. HTML de gizli alan ekleme

html kodu içerisine gizli bir alan ekleyebiliriz. Bu alanda kullanıcı sayfada gezmeye başladığı andan itibaren unique bir id değeri saklarız.
Bu metod linklerle kullanılamaz; çünkü her request yapıldığında tekrardan formun doldurulmasını gerektirir.
Ayrıca html kodundaki gizli alanı başkaları kolayca elde edip session'ı ele geçirebileceğinden, güvenli de değildir.

3. URL rewriting

Her request ve response'a bir session id parametresi ekleyebiliriz. Böylece session id bilgisini tutabiliriz.
Bu işlem de çok yorucu olur; çünkü her response gelişinde bu parametreyi takip etmemiz ve başka parametrelerle çakışmadığından emin olmamız gerekir.

4. cookie kullanma

Cookie'ler web server tarafından response header'da gönderilen ve tarayıcıda saklanan verilerdir.
Client request göndereceği zaman request header'ına cookie'ye ekler ve bu sayede session takip edilir.
Cookie'lerle session yapılabilir; fakat client cookie'leri kapattığında bu yöntem çalışmayacaktır.


Bütün bu yöntemlerdeki başlıca sorunlar şunlardır:
-Genellikle sadece session id değil, başka bilgiler de tutulmak isteniyor. Bu yöntemlerle bunları yönetmek çok zordur.
-Her birinin çalışmadığı özel durumlar mevcut. Her koşulda çalışmıyorlar.

5. session management API


Java session management API ile diğer yöntemlerin aksine her senaryoda çalışan bir session management yapabiliriz.


Cookie ile session yönetme


Bir çok web uygulaması cookielerle session takibi yapar ya da önceki seçimlerinize göre özelleştirilmiş cevaplar verir.

javax.servlet.http.Cookie classı ile cookie yaratabiliyoruz.
Cookie loginCookie = new Cookie("user",user);
cookie'ye setMaxAge() metodu ile saniye bazında geçerlilik süresi verebiliyoruz.

loginCookie.setMaxAge(30*60);
http response mesajına bu cookie'yi eklediğimizde artık verdiğimiz süre boyunca session devam ediyor.
response.addCookie(loginCookie);

...

Örnek bir servlet ile session cookie uygulaması


@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private final String userID = "Pankaj";
    private final String password = "journaldev";
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // get request parameters for userID and password
        String user = request.getParameter("user");
        String pwd = request.getParameter("pwd");
         
        if(userID.equals(user) && password.equals(pwd)){
            Cookie loginCookie = new Cookie("user",user);
            //setting cookie to expiry in 30 mins
            loginCookie.setMaxAge(30*60);
            response.addCookie(loginCookie);
            response.sendRedirect("LoginSuccess.jsp");
        }else{
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.html");
            PrintWriter out= response.getWriter();
            out.println("<font color=red>Either user name or password is wrong.</font>");
            rd.include(request, response);
        }
    }
}

...

Aynı şekilde eğer çıkış yap(logout) linki tıklanırsa, cookie'nin silinmesi gerekiyor.
Cookie'yi direkt olarak silemesek de, süresini 0 yaptığımızda hemen browserdan silinecektir.

Örnek:

@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
        
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        Cookie loginCookie = null;
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
        for(Cookie cookie : cookies){
            if(cookie.getName().equals("user")){
                loginCookie = cookie;
                break;
            }
        }
        }
        if(loginCookie != null){
            loginCookie.setMaxAge(0);
            response.addCookie(loginCookie);
        }
        response.sendRedirect("login.html");
    }
}

...


Hiç yorum yok:

Yorum Gönder