4.1 Introduktion till HttpSession

Om flera förfrågningar kommer från samma klient, så säger de att en session har upprättats mellan klienten och servern. För att styra denna process har behållaren ett speciellt HttpSession-objekt.

När en klient gör en begäran till en servlet kontrollerar servletbehållaren om sessions-ID-parametern finns i begäran. Om det inte finns någon sådan parameter (till exempel klienten kontaktar servern för första gången), skapar servletbehållaren ett nytt HttpSession-objekt och tilldelar det också ett unikt ID.

Sessionsobjektet lagras på servern, och ID:t skickas som svar till klienten och lagras som standard på klienten i en cookie. Sedan, när en ny begäran kommer in från samma klient, hämtar servletbehållaren ID:t från den, och genom det ID:t hittar det korrekta HttpSession-objektet på servern.

Du kan hämta sessionsobjektet från en begäran (ett HttpServletRequest-objekt), där du måste anropa metoden getSession(). Det returnerar ett HttpSession-objekt.

Varför behövs en session? Den kan lagra information om klienten mellan samtal. Hon har något som en HashMap inuti, där du kan lagra föremål med nycklar. Och några metoder för detta:

Metoder Beskrivning
1 setAttribute(String name, Object o) Lägger till ett objekt i sessionen
2 getAttribute(String name) Får ett objekt från sessionen
3 removeAttribute(String name) Tar bort ett objekt från sessionen

Låt oss skriva en servlet som summerar alla siffror som skickats till den från olika förfrågningar:

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

Finns det något mer vi inte har sagt om HttpSession-objektet?

Först är det namnet J SESSION ID. Det är under det som sessions-ID:t lagras i cookies. Som du kan se är det ganska lätt att komma ihåg: J+SESSION+ID.

För det andra har sessionen några fler användbara metoder:

Metoder Beskrivning
1 getAttributeNames() Returnerar en lista över alla nycklar som lagrats i sessionen
2 getId() Returnerar sessions-ID (sträng)
3 isNew() Returnerar sant om sessionsobjektet skapades i den aktuella begäran
4 setMaxInactiveInterval(int seconds) Ställer in sessionens inaktivitetsintervall i sekunder
5 invalidate() Tar bort alla objekt från sessionen

Här är alla metoder uppenbara, men setMaxInactiveInterval()vi kommer att prata om lite mer.

Om servern lagrar tiotusentals sessioner, inklusive data från klienter som besökte den förra månaden, kommer det helt enkelt att ta slut på minne. Därför finns det ett sätt att ställa in "sessionens livslängd".

Om ingen använde sessionen under ett tidsintervall, rensar den sig själv - alla objekt som den lagrade raderas från den. Detta görs för att spara minne.

Som standard är detta intervall 1800 sekunder == 30 minuter. Om du ställer in värdet till -1, kommer sessionen att vara "evig" och raderas endast när användaren stänger webbläsarfliken (nåja, eller klienten kopplar bort).

Exempel:

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