4.1 HttpSession'a Giriş

Aynı istemciden birkaç istek gelirse, istemci ile sunucu arasında bir oturum kurulduğunu söylerler. Bu işlemi kontrol etmek için kapsayıcının özel bir HttpSession nesnesi vardır.

Bir istemci bir sunucu uygulamasına istekte bulunduğunda, sunucu uygulaması kapsayıcısı, istekte oturum kimliği parametresinin mevcut olup olmadığını kontrol eder. Böyle bir parametre yoksa (örneğin, istemci sunucuyla ilk kez iletişim kuruyorsa), servlet kapsayıcısı yeni bir HttpSession nesnesi oluşturur ve buna benzersiz bir kimlik atar.

Oturum nesnesi sunucuda depolanır ve kimlik istemciye yanıt olarak gönderilir ve varsayılan olarak istemcide bir tanımlama bilgisinde depolanır. Ardından, aynı istemciden yeni bir istek geldiğinde, servlet kapsayıcısı kimliği ondan alır ve bu kimliğe göre sunucuda doğru HttpSession nesnesini bulur.

Oturum nesnesini, getSession() yöntemini çağırmanız gereken bir istekten (bir HttpServletRequest nesnesi) alabilirsiniz. Bir HttpSession nesnesi döndürür.

Seans neden gereklidir? Aramalar arasında müşteri hakkında bilgi depolayabilir. İçinde, nesneleri anahtarlarla saklayabileceğiniz HashMap gibi bir şeye sahip. Ve bunun için bazı yöntemler:

Yöntemler Tanım
1 setAttribute(String name, Object o) Oturuma bir nesne ekler
2 getAttribute(String name) Oturumdan bir nesne alır
3 removeAttribute(String name) Oturumdan bir nesneyi kaldırır

Farklı isteklerden kendisine iletilen tüm sayıları toplayacak bir sunucu uygulaması yazalım:

public class CalculatorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
         // Get the "sum" attribute from the session
        HttpSession session = request.getSession();
        Integer sum = (Integer) session.getAttribute("sum");
        //Handling the situation when the session does not yet have such an attribute
        if (sum == null)
            sum = 0;

         // Get the "n" parameter from the request
        String n = request.getParameter("n");
        sum += Integer.parseInt(n);

         // Write the "sum" attribute to the session
        session.setAttribute("sum", sum);

        // Print the HTML as a response to the browser
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head> <title> CalculatorServlet </title> </head>");
        out.println("<body>");
        out.println("<h1> Sum == " + sum + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

4.2 HttpSession hakkında daha fazla bilgi

HttpSession nesnesi hakkında söylemediğimiz başka bir şey var mı?

İlk olarak, J OTURUM KİMLİĞİ adıdır . Oturum kimliğinin çerezlerde saklandığı yerin altındadır. Gördüğünüz gibi, hatırlaması oldukça kolay: J+SESSION+ID.

İkinci olarak, oturumun birkaç yararlı yöntemi daha vardır:

Yöntemler Tanım
1 getAttributeNames() Oturumda saklanan tüm anahtarların bir listesini döndürür
2 getId() Oturum kimliğini (dize) döndürür
3 isNew() Geçerli istekte oturum nesnesi oluşturulmuşsa true değerini döndürür
4 setMaxInactiveInterval(int seconds) Oturum hareketsizlik aralığını saniye cinsinden ayarlar
5 invalidate() Oturumdaki tüm nesneleri kaldırır

Burada tüm yöntemler açık ama setMaxInactiveInterval()biraz daha bahsedeceğiz.

Sunucu, geçen ay onu ziyaret eden müşterilerin verileri de dahil olmak üzere on binlerce oturumu depolarsa, o zaman belleği tamamen tükenir. Bu nedenle, “oturum ömrünü” ayarlamanın bir yolu vardır.

Oturumu bir süre kimse kullanmadıysa, oturum kendi kendini temizler - depoladığı tüm nesneler oturumdan silinir. Bu hafızayı kurtarmak için yapılır.

Varsayılan olarak, bu aralık 1800 saniye == 30 dakikadır. Değeri -1 olarak ayarlarsanız, oturum "ebedi" olur ve yalnızca kullanıcı tarayıcı sekmesini kapattığında (ya da istemcinin bağlantısı kesildiğinde) silinir.

Örnekler:

// get all keys
Enumeration keys = session.getAttributeNames();
while( keys.hasMoreElements() ){
    System.out.println( (String) keys.nextElement() );
}
// set the inactivity interval
session.setMaxInactiveInterval(60*60*24);   // 1 day
session.setMaxInactiveInterval(-1); // until the browser is closed
// remove all data from the session
session.invalidate();