4.1 Inleiding tot HttpSession

Als er meerdere verzoeken van dezelfde client komen, zeggen ze dat er een sessie tot stand is gebracht tussen de client en de server. Om dit proces te besturen heeft de container een speciaal HttpSession-object.

Wanneer een client een verzoek doet aan een servlet, controleert de servletcontainer of de sessie-ID-parameter aanwezig is in het verzoek. Als een dergelijke parameter niet bestaat (de client maakt bijvoorbeeld voor het eerst contact met de server), maakt de servletcontainer een nieuw HttpSession-object en kent het ook een uniek ID toe.

Het sessieobject wordt op de server opgeslagen en de ID wordt in het antwoord naar de client verzonden en wordt standaard in een cookie op de client opgeslagen. Wanneer er vervolgens een nieuw verzoek binnenkomt van dezelfde client, haalt de servletcontainer de ID ervan op en vindt aan de hand van die ID het juiste HttpSession-object op de server.

U kunt het sessieobject ophalen uit een verzoek (een HttpServletRequest-object), waarop u de methode getSession() moet aanroepen. Het retourneert een HttpSession-object.

Waarom is een sessie nodig? Het kan informatie over de klant opslaan tussen oproepen. Ze heeft zoiets als een HashMap van binnen, waarin je objecten met sleutels kunt opslaan. En enkele methoden hiervoor:

methoden Beschrijving
1 setAttribute(String name, Object o) Voegt een object toe aan de sessie
2 getAttribute(String name) Haalt een object op uit de sessie
3 removeAttribute(String name) Verwijdert een object uit de sessie

Laten we een servlet schrijven die alle nummers opsomt die door verschillende verzoeken zijn doorgegeven:

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 Meer over HttpSession

Is er nog iets dat we niet hebben gezegd over het HttpSession-object?

Ten eerste is het de naam J SESSION ID. Daaronder wordt de sessie-ID opgeslagen in cookies. Zoals je kunt zien, is het vrij eenvoudig te onthouden: J+SESSION+ID.

Ten tweede heeft de sessie nog een paar handige methoden:

methoden Beschrijving
1 getAttributeNames() Retourneert een lijst met alle sleutels die in de sessie zijn opgeslagen
2 getId() Retourneert de sessie-ID (tekenreeks)
3 isNew() Retourneert waar als het sessieobject is gemaakt in de huidige aanvraag
4 setMaxInactiveInterval(int seconds) Stelt het sessie-inactiviteitsinterval in seconden in
5 invalidate() Verwijdert alle objecten uit de sessie

Hier liggen alle methoden voor de hand, maar setMaxInactiveInterval()we zullen er wat meer over vertellen.

Als de server tienduizenden sessies opslaat, inclusief de gegevens van klanten die hem vorige maand hebben bezocht, dan zal het geheugen gewoon vol raken. Daarom is er een manier om de "sessielevensduur" in te stellen.

Als niemand de sessie gedurende een bepaalde tijd heeft gebruikt, wist deze zichzelf - alle opgeslagen objecten worden eruit verwijderd. Dit wordt gedaan om geheugen te sparen.

Standaard is dit interval 1800 seconden == 30 minuten. Als u de waarde instelt op -1, is de sessie "eeuwig" en wordt deze alleen verwijderd wanneer de gebruiker het browsertabblad sluit (nou ja, of de client verbreekt de verbinding).

Voorbeelden:

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