4.1 A HttpSession bemutatása

Ha több kérés érkezik ugyanattól a klienstől, akkor azt mondják, hogy munkamenet jött létre a kliens és a szerver között. Ennek a folyamatnak a vezérléséhez a tároló egy speciális HttpSession objektummal rendelkezik.

Amikor egy ügyfél kérést intéz egy szervlethez, a szervlet-tároló ellenőrzi, hogy a munkamenet-azonosító paraméter szerepel-e a kérésben. Ha nincs ilyen paraméter (például a kliens először lép kapcsolatba a szerverrel), akkor a servlet-tároló létrehoz egy új HttpSession objektumot, és hozzárendel egy egyedi azonosítót is.

A munkamenet objektumot a szerver tárolja, és az azonosítót válaszként küldi el a kliensnek, és alapértelmezés szerint a kliens egy cookie-ban tárolja. Ezután, amikor új kérés érkezik ugyanattól a klienstől, a servlet-tároló lekéri tőle az azonosítót, és ezzel az azonosítóval megtalálja a megfelelő HttpSession objektumot a kiszolgálón.

A session objektumot lekérheti egy kérésből (egy HttpServletRequest objektumból), amelyen meg kell hívnia a getSession() metódust. Egy HttpSession objektumot ad vissza.

Miért van szükség egy ülésre? A hívások között információkat tárolhat az ügyfélről. Valami HashMap-hez hasonló van benne, amelyben kulcsok alapján tárolhatja az objektumokat. És néhány módszer erre:

Mód Leírás
1 setAttribute(String name, Object o) Objektumot ad a munkamenethez
2 getAttribute(String name) Lekér egy objektumot a munkamenetből
3 removeAttribute(String name) Eltávolít egy objektumot a munkamenetből

Írjunk egy servletet, amely összegzi a különböző kérésekből neki átadott összes számot:

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 További információ a HttpSessionról

Van még valami, amit nem mondtunk el a HttpSession objektumról?

Először is ez a J SESSION ID név. Ez alatt tárolódik a munkamenet-azonosító a cookie-kban. Amint látja, elég könnyű megjegyezni: J+SESSION+ID.

Másodszor, a munkamenetnek van még néhány hasznos módszere:

Mód Leírás
1 getAttributeNames() A munkamenetben tárolt összes kulcs listáját adja vissza
2 getId() Visszaadja a munkamenet azonosítóját (karakterlánc)
3 isNew() Igaz értéket ad vissza, ha a munkamenet objektumot az aktuális kérésben hozták létre
4 setMaxInactiveInterval(int seconds) Beállítja a munkamenet inaktivitási intervallumát másodpercben
5 invalidate() Eltávolítja az összes objektumot a munkamenetből

Itt minden módszer nyilvánvaló, de setMaxInactiveInterval()egy kicsit többet fogunk beszélni.

Ha a szerver több tízezer munkamenetet tárol, beleértve a múlt hónapban látogató ügyfelek adatait is, akkor egyszerűen elfogy a memóriája. Ezért van mód a „munkamenet élettartamának” beállítására.

Ha egy ideig senki sem használta a munkamenetet, akkor törli magát - az összes tárolt objektum törlődik belőle. Ez a memória megtakarítása érdekében történik.

Alapértelmezés szerint ez az intervallum 1800 másodperc == 30 perc. Ha az értéket -1-re állítja, akkor a munkamenet „örök” lesz, és csak akkor törlődik, ha a felhasználó bezárja a böngésző lapot (vagy a kliens megszakítja a kapcsolatot).

Példák:

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