JavaRush /Kurslar /All lectures for UZ purposes /Servletning Sessiyalar Bilan Ishlashi

Servletning Sessiyalar Bilan Ishlashi

All lectures for UZ purposes
Daraja, Dars
Mavjud

4.1 HttpSession bilan tanishuv

Agar bir nechta so'rovlar bitta mijozdan kelib tushsa, mijoz va server o'rtasida sessiya o'rnatilgan, deyiladi. Bu jarayonni boshqarish uchun konteynerda maxsus HttpSession obyekti mavjud.

Mijoz servletga murojaat qilganda, servletlar konteyneri so'rovda sessiya ID parametri mavjudligini tekshiradi. Agar bunday parametr yo'q bo'lsa (masalan, mijoz birinchi marta serverga murojaat qilsa), u holda servletlar konteyneri yangi HttpSession obyekti yaratadi va unga noyob ID tayinlaydi.

Sessiya obyekti serverda saqlanadi, ID esa mijozga javob bo'lib yuboriladi va odat bo'yicha mijozning cookies-da saqlanadi. Keyin, shu mijozdan yangi so'rov kelganda, servletlar konteyneri undagi ID ni chiqarib oladi va shu ID bo'yicha serverdagi to'g'ri HttpSession obyektini topadi.

Sessiya obyektini so'rovdan (HttpServletRequest obyekti) olish mumkin, unda getSession() metodini chaqirish kerak. U HttpSession obyektini qaytaradi.

Sessiya nima uchun kerak? Unda mijoz haqidagi ma'lumotlarni chaqiriqlar orasida saqlash mumkin. Uning ichida bir yoki bir nechta HashMap yoki unga o'xshash narsa mavjud bo'lib, unda ob'ektlarni kalitlar bo'yicha saqlash mumkin. Bu uchun bir nechta metodlar mavjud:

Metodlar Tavsif
1 setAttribute(String name, Object o) Obyektni sessiyaga qo'shadi
2 getAttribute(String name) Obyektni sessiyadan oladi
3 removeAttribute(String name) Obyektni sessiyadan olib tashlaydi

Keling, turli so'rovlardan yuborilgan sonlarni jamlovchi servlet yozamiz:



public class CalculatorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
         // Sessiyadan “sum” atributini olamiz 
        HttpSession session = request.getSession();
        Integer sum = (Integer) session.getAttribute("sum");
        //Agar sessiyada bunday atribut mavjud bo'lmasa, holatni qayta ishlaymiz
        if (sum == null)
            sum = 0; 
 
         // So'rovdan “n” parametrini olamiz
        String n = request.getParameter("n");
        sum += Integer.parseInt(n);
 
         // Sessiyaga “sum” atributini yozamiz
        session.setAttribute("sum", sum);
 
        // Brauzer uchun javob sifatida HTML-ni chiqaramiz
        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 haqida batafsil

HttpSession obyekti haqida yana nima muhim narsa aytilmagan?

Birinchidan, bu JSESSIONID nomi. Aynan shu nom bilan cookies-da sessiya ID saqlanadi. Ko'rib turganingizdek, uni eslab qolish oson: J+SESSION+ID.

Ikkinchidan, sessiyada yana bir nechta foydali metodlar mavjud:

Metodlar Tavsif
1 getAttributeNames() Sessiyada saqlanayotgan barcha kalitlar ro'yxatini qaytaradi
2 getId() ID-sessiyani (qator) qaytaradi
3 isNew() Agar sessiya obyekti joriy so'rovda yaratilgan bo'lsa, true qaytaradi
4 setMaxInactiveInterval(int seconds) Sessiyaning nofaollik intervalini soniyada o'rnatadi
5 invalidate() Sessiyadagi barcha ob'ektlarni olib tashlaydi

Bu yerda barcha metodlar tushunarli, ammo setMaxInactiveInterval() haqida batafsilroq gaplashamiz.

Agar server minglab sessiyalarni, shu jumladan, o'tgan oyda unga kirgan mijozlar ma'lumotlarini saqlasa, oddiygina xotira tugaydi. Shuning uchun "sessiya umrini" o'rnatish usuli mavjud.

Agar interval davomida sessiya ishlatilmagan bo'lsa, u o'z-o'zidan tozalanadi — unda saqlangan barcha ob'ektlar olib tashlanadi. Bu xotirani tejash uchun qilingan.

Odat bo'yicha bu interval 1800 soniya == 30 daqiqaga teng. Agar -1 qiymati o'rnatilsa, sessiya "abadiy" bo'ladi va faqat foydalanuvchi brauzer yorlig'ini yopganda (yoki mijoz ulanishni uzganda) olib tashlanadi.

Misollar:

// barcha kalitlarni olish
Enumeration keys = session.getAttributeNames();
while( keys.hasMoreElements() ){
    System.out.println( (String) keys.nextElement() );
}

        
// nofaollik intervalini o'rnatish
session.setMaxInactiveInterval(60*60*24);   // 1 kun
session.setMaxInactiveInterval(-1); // brauzer yopilguncha
        
// sessiyadan barcha ma'lumotlarni o'chirish
session.invalidate();
        
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION