4.1 Introduktion til HttpSession

Hvis flere anmodninger kommer fra samme klient, så siger de, at der er etableret en session mellem klienten og serveren. For at styre denne proces har containeren et specielt HttpSession-objekt.

Når en klient foretager en anmodning til en servlet, kontrollerer servletbeholderen, om sessions-id-parameteren er til stede i anmodningen. Hvis der ikke er en sådan parameter (f.eks. kontakter klienten serveren for første gang), opretter servletcontaineren et nyt HttpSession-objekt og tildeler det også et unikt ID.

Sessionsobjektet gemmes på serveren, og ID'et sendes i svaret til klienten, og gemmes som standard på klienten i en cookie. Når der så kommer en ny anmodning ind fra den samme klient, henter servlet-beholderen ID'et fra den, og ved hjælp af dette ID finder det korrekte HttpSession-objekt på serveren.

Du kan hente sessionsobjektet fra en anmodning (et HttpServletRequest-objekt), hvorpå du skal kalde getSession()-metoden. Det returnerer et HttpSession-objekt.

Hvorfor er en session nødvendig? Det kan gemme oplysninger om klienten mellem opkald. Hun har noget i retning af et HashMap indeni, hvori du kan gemme genstande med nøgler. Og nogle metoder til dette:

Metoder Beskrivelse
1 setAttribute(String name, Object o) Tilføjer et objekt til sessionen
2 getAttribute(String name) Henter et objekt fra sessionen
3 removeAttribute(String name) Fjerner et objekt fra sessionen

Lad os skrive en servlet, der opsummerer alle de tal, der er sendt til den fra forskellige anmodninger:

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 Mere om HttpSession

Er der andet, vi ikke har sagt om HttpSession-objektet?

For det første er det navnet J SESSION ID. Det er under den, at sessions-id'et gemmes i cookies. Som du kan se, er det ret nemt at huske: J+SESSION+ID.

For det andet har sessionen et par mere nyttige metoder:

Metoder Beskrivelse
1 getAttributeNames() Returnerer en liste over alle nøgler, der er gemt i sessionen
2 getId() Returnerer sessions-id'et (streng)
3 isNew() Returnerer sand, hvis sessionsobjektet blev oprettet i den aktuelle anmodning
4 setMaxInactiveInterval(int seconds) Indstiller sessionsinaktivitetsintervallet i sekunder
5 invalidate() Fjerner alle objekter fra sessionen

Her er alle metoderne indlysende, men setMaxInactiveInterval()vi vil tale om lidt mere.

Hvis serveren gemmer titusindvis af sessioner, inklusive data fra klienter, der besøgte den i sidste måned, så løber den simpelthen tør for hukommelse. Derfor er der en måde at indstille "sessionens levetid".

Hvis ingen brugte sessionen i et interval af tid, rydder den sig selv - alle objekter, som den har gemt, slettes fra den. Dette gøres for at spare hukommelse.

Som standard er dette interval 1800 sekunder == 30 minutter. Hvis du indstiller værdien til -1, vil sessionen være "evig" og vil kun blive slettet, når brugeren lukker browserfanen (nå, eller klienten afbryder forbindelsen).

Eksempler:

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