www.fatihkabakci.com

Personal Website and Computer Science TUR EN

SERVLET SESSION KAVRAMI

Last update: 4/25/2015 12:04:00 AM

Yazan: Fatih KABAKCI

Kelime anlamı itibariyle oturum anlamına gelen session yapıları, istemci oturum izleme(session tracking) yöntemleri için kullanılmaktadır. Yani, bir sunucunun istemciyi hatırlaması için herhangi bir bilgiyi içerir. Genelde tüm dinamik web programlama dillerinde bulunan oturum nesneleri, Servlet içerisinde HttpSession arabirimi ile sarmalanır. Bir HttpSession, bir Cookie(Çerez) üzerinden sunucu tarafında muhafaza edilen nesnedir. Session' ları daha iyi anlamak için aşağıdaki örnek uygulamayı inceleyelim.

Aşağıda, daha önceden Servlet Cookie(Çerezler) adlı yazıda anlatılan login örneği verilmektedir. Burada konu, daha iyi anlaşılması adına örnek kod üzerinden anlatılacaktır.

login.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<form action="LoginServlet" method="post">
<h1>Login</h1>
UserName: <input type="text" name="userName">
Password: <input type="password" name="password">
<input type="submit" value="Login" name="btn_submit">
</form>
</body>
</html>

Yukarıdaki login.html sayfası, basitçe iki input bir de onay butonuna sahip bir form sayfası barındırır. Sayfa kullanıcıdan aldığı isim ve şifre bilgilerinden sonra HTTP Get sorgusu yaparak LoginServlet adlı Servlet uygulamasını çağırır.

LoginServlet.java

package com.fatihkabakci;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class LoginServlet
 * 
 * @author www.fatihkabakci.com
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
   private static final long  serialVersionUID = 1L;

   public static final String USER_NAME        = "userName";

   public boolean verifyUser(String userName, String password) {
      // query check from db
      return true;
   }

   /**
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    */
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      String userName = request.getParameter("userName");
      String password = request.getParameter("password");

      if (verifyUser(userName, password)) {
         HttpSession userSession = request.getSession(true);
         userSession.setMaxInactiveInterval(5);
         userSession.setAttribute(USER_NAME, userName);
         String encodedUrl = response.encodeRedirectURL("http://localhost:8080/JServlet/GoServlet");
         response.sendRedirect(encodedUrl);
      }
      else {
         response.sendRedirect("http://localhost:8080/JServlet/login.html");
      }
   }

   /**
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    */
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      doGet(request, response);
   }
}

LoginServlet sınıfının çalışma mantığını adım adım inceleyelim. Sınıf, ilk olarak kullanıcıdan aldığı HTTP form verilerini elde eder. Daha sonra bu verileri temsili olarak bir kontrol mekanizmasında çalıştırır. Gerçek uygulamalarda bu mekanizma, bir veritabanı sorgusu içerir. Kullanıcıların geçerlilik denetimi işletildikten sonra bir HTTP isteğinden elde edilen session yaratılır.

HttpSession userSession = request.getSession(true);

Yukarıdaki ifade gelen HTTP isteğindeki session' u döndürür. Şayet hali hazırda bir session yaratılmamışsa, yeni bir session burada yaratılır. getSession() metoduna aktarılan true argümanı bu işe yarar. Bu argümanın false olması, mevcut bir session varsa elde et, aksi halde null dön görevi yapar. Peki mevcut bir session olup olmadığı nasıl bilinir ? Daha önceden HttpSession datalarının bir cookie üzerinden sunucu tarafında saklandığından bahsedilmişti. Burada her bir session' ın id bilgisi cookie' ler üzerinde taşınır. Bunun anlamı oluşturulan her oturum bilgisinin sahip olduğu id değerinin kullanıcı ile paylaşılmasıdır. Oturum bir kere oluşturulduğu anda bu oturumun sahip olduğu id bilgisi istemciye gönderilir. Apache Tomcat Servlet Konteyner' ı bu id' ye JSESSIONID adını verir. JSESSIONID bilgisi, HTTP cevap Set-cookie başlığında taşınarak istemciye iletilir. İstemci bundan sonra yapacağı her istek için HTTP istek Cookie başlığında JSESSIONID bilgisini sunucuya ileterek kendini tanıtır. Sunucu bu bilgiye göre kendi belleğine başvurur ve kullanıcıyı eşleştirir. Şayet istemci tarayıcısı üzerinde cookie özelliğini kapatırsa, url-rewriting(url' i yeniden yazma) özelliği kullanılır. Bu özellikte, JSESSIONID bilgisi istek url' i üzerinde taşınır. Bu ise encodeUrl() ve/veya encodeRedirectUrl() metotları ile sağlanır. Yazının ilerleyen bölümlerinde buna tekrar değinilecektir.

Uygulamaya devam edelim. LoginServlet sınıfına ilk kez gelen program, burada yeni bir session yaratır. Daha sonra setMaxInactiveInterval(5), kullanıcı hiç bir şey yapmaz ise 5 saniye içinde oturumunu unut anlamına gelen metot çağrılır. Session yaşam süresi de belirlendikten sonra, kullanıcı adı sunucu belleğinde saklanır. Daha önceden belirtildiği gibi, HttpSession verileri, sunucu da saklanır.

String encodedUrl = response.encodeRedirectURL("http://localhost:8080/JServlet/GoServlet");

Yukarıdaki ifade ile daha önceden açıklanan urli yeniden yazma, url-rewriting özelliği uygulanır. Bu, istemcinin cookie özelliğini kapatma ihtimaline karşı yazılmıştır. Şayet cookie kapalı ise JSESSIONID bilgisi url üzerinden GoServlet uygulamasına gönderilir. Cookie açık ise bu metot hiç bir şey yapmadan aynı url' i geri döndürür. Cookienin açık ya da kapalı olmasına göre kodlanmış ya da kodlanmamış url ile GoServlet uygulamasına yönlendirme yapılır.

GoServlet.java

package com.fatihkabakci;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class GoServlet
 * 
 * @author www.fatihkabakci.com
 */
@WebServlet("/GoServlet")
public class GoServlet extends HttpServlet {
   private static final long  serialVersionUID = 1L;

   public static final String USER_NAME        = "userName";

   /**
    * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
    */
   protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      HttpSession session = request.getSession(false);
      if (session != null) {
         Object userName = session.getAttribute(USER_NAME);
         if (userName != null) {
            out.println("<b>Welcome " + userName + "</b>");
         }
      }
      else {
         response.sendRedirect("http://localhost:8080/JServlet/login.html");
      }
   }
}

GoServlet uygulaması çıktıyı html formatında ayarladıktan sonra, ilk olarak mevcut oturumu elde eden aşağıdaki ifadeyi çalıştırır.

HttpSession session = request.getSession(false);

Bu ifade LoginServlet sınıfındaki oturum bilgisinin false argümanı ile çağrılmasıyla farklıdır. Burada hali hazırda bir oturum olup olmaması araştırılır. Çünkü GoServlet artık LoginServlet' in oluşturduğu oturumu aramalıdır. Şayet bir şekilde doğrudan bu Servlete ulaşmış bir kullanıcı var ise, mevcut oturumu null olarak bulunur. Oturum elde edildikten sonra her bir oturum verisi getAttribute() metodu ile elde edilir.

Cookie etkin iken


Kullanıcı LoginServlet tarafından aldığı HTTP cevap içerisinde JSESSIONID bilgisini alır. Bu bilgi cookie üzerinde taşındığı için Set-cookie başlığı unique session id bilgisini içerir.


JSESSIONID, daha sonra GoServlet HTTP isteğinin Cookie başlığında yazılarak sunucuya gönderilir.


JSESSIONID, mevcut oturum bilgisini doğruladıktan sonra ekrana hoşgeldin yazar.


Cookie pasif iken

Cookie tarayıcı tarafında kullanıcı tarafında kapatıldığında, JSESSIONID bilgisi aşağıda görüldüğü gibi url üzerinde gönderilir. Bu işleme url-rewriting(url' i yeniden yazma) adı verilir.


Bilgi yukarıdaki gibi url üzerinde giderken, cookie istemci tarafında kapatıldığı için Cookie başlığı HTTP isteğinde bulunmaz.


HttpSession dataları ile Cookie dataları arasındaki en temel fark, HttpSession' nın sunucu, Cookie' nin istemci tarafında tutulmasıdır. Cookie' ler kullanıcılar tarafından kapatılıp açılma opsiyonlarını bulundurur. Yani her zaman bir cookie' nin aktif olacağının garantisi yoktur. HttpSession bu açıdan, HttpServletResponse sınıfının sahip olduğu encodeUrl() metodu ile garanti verir.

Benzer yazılar:

Servlet Cookie(Çerezler)
There has been no comment yet

Name:


Question/Comment
   Please verify the image




The Topics in Computer Science

Search this site for





 

Software & Algorithms

icon

In mathematics and computer science, an algorithm is a step-by-step procedure for calculations. Algorithms are used for calculation, data processing, and automated reasoning.

Programming Languages

icon

A programming language is a formal constructed language designed to communicate instructions to a machine, particularly a computer. It can be used to create programs to control the behavior of a machine. Java,C, C++,C#

Database

icon

A database is an organized collection of data. The data are typically organized to model aspects of reality in a way that supports processes requiring information.

Hardware

icon

Computer hardware is the collection of physical elements that constitutes a computer system. Computer hardware refers to the physical parts or components of a computer such as the monitor, memory, cpu.

Web Technologies

icon

Web development is a broad term for the work involved in developing a web site for the Internet or an intranet. Html,Css,JavaScript,ASP.Net,PHP are one of the most popular technologies. J2EE,Spring Boot, Servlet, JSP,JSF, ASP

Mobile Technologies

icon

Mobile application development is the process by which application software is developed for low-power handheld devices, such as personal digital assistants, enterprise digital assistants or mobile phones. J2ME

Network

icon

A computer network or data network is a telecommunications network that allows computers to exchange data. In computer networks, networked computing devices pass data to each other along data connections.

Operating Systems

icon

An operating system is software that manages computer hardware and software resources and provides common services for computer programs. The OS is an essential component of the system software in a computer system. Linux,Windows

Computer Science

icon

Computer science is the scientific and practical approach to computation and its applications.A computer scientist specializes in the theory of computation and the design of computational systems.