4.1 Въведение в HttpSession

Ако няколко заявки идват от един и същи клиент, те казват, че е установена сесия между клиента и сървъра. За да контролира този процес, контейнерът има специален обект HttpSession.

Когато клиент направи заявка към сървлет, контейнерът на сървлета проверява дали параметърът ID на сесията присъства в заявката. Ако няма такъв параметър (например, клиентът се свързва със сървъра за първи път), тогава контейнерът на сървлета създава нов обект HttpSession и също така му присвоява уникален идентификатор.

Обектът на сесията се съхранява на сървъра и идентификаторът се изпраща в отговор на клиента и по подразбиране се съхранява на клиента в бисквитка. След това, когато дойде нова заявка от същия клиент, контейнерът на сервлета извлича идентификатора от него и чрез този идентификатор намира правилния обект HttpSession на сървъра.

Можете да получите обекта на сесията от заявка (обект HttpServletRequest), на която трябва да извикате метода getSession(). Той връща обект HttpSession.

Защо е необходима сесия? Може да съхранява информация за клиента между разговорите. Тя има нещо като HashMap вътре, в която можете да съхранявате обекти по ключове. И някои методи за това:

Методи Описание
1 setAttribute(String name, Object o) Добавя обект към сесията
2 getAttribute(String name) Получава обект от сесията
3 removeAttribute(String name) Премахва обект от сесията

Нека напишем сървлет, който ще сумира всички числа, предадени му от различни заявки:

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

Има ли нещо друго, което не сме казали за обекта HttpSession?

Първо, това е името J SESSION ID. Именно под него в бисквитките се съхранява идентификаторът на сесията. Както можете да видите, това е доста лесно за запомняне: J+SESSION+ID.

Второ, сесията има още няколко полезни метода:

Методи Описание
1 getAttributeNames() Връща списък на всички ключове, съхранени в сесията
2 getId() Връща ID на сесията (низ)
3 isNew() Връща true, ако обектът на сесията е създаден в текущата заявка
4 setMaxInactiveInterval(int seconds) Задава интервала на неактивност на сесията в секунди
5 invalidate() Премахва всички обекти от сесията

Тук всички методи са очевидни, но setMaxInactiveInterval()ще говорим малко повече.

Ако сървърът съхранява десетки хиляди сесии, включително данните на клиенти, които са го посетor миналия месец, тогава просто ще му свърши паметта. Следователно има начин да зададете „живот на сесията“.

Ако никой не е използвал сесията за определен интервал от време, тя се самоизчиства - всички обекти, които е съхранила, се изтриват от нея. Това се прави, за да се спести памет.

По подразбиране този интервал е 1800 секунди == 30 minutesи. Ако зададете стойността на -1, тогава сесията ще бъде „вечна“ и ще бъде изтрита само когато потребителят затвори раздела на браузъра (добре, or клиентът прекъсне връзката).

Примери:

// 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();