4.1 Introduksjon til HttpSession

Hvis flere forespørsler kommer fra samme klient, sier de at det er etablert en økt mellom klienten og serveren. For å kontrollere denne prosessen har beholderen et spesielt HttpSession-objekt.

Når en klient sender en forespørsel til en servlet, sjekker servletbeholderen om sesjons-ID-parameteren er til stede i forespørselen. Hvis det ikke finnes en slik parameter (for eksempel klienten kontakter serveren for første gang), oppretter servletbeholderen et nytt HttpSession-objekt og tildeler det også en unik ID.

Sesjonsobjektet lagres på serveren, og IDen sendes i svaret til klienten, og lagres som standard på klienten i en informasjonskapsel. Så, når en ny forespørsel kommer inn fra den samme klienten, henter servletbeholderen IDen fra den, og ved den ID finner den riktige HttpSession-objektet på serveren.

Du kan hente sesjonsobjektet fra en forespørsel (et HttpServletRequest-objekt), som du må kalle getSession()-metoden på. Den returnerer et HttpSession-objekt.

Hvorfor trengs en økt? Den kan lagre informasjon om klienten mellom samtaler. Hun har noe sånt som et HashMap inni, der du kan lagre gjenstander med nøkler. Og noen metoder for dette:

Metoder Beskrivelse
1 setAttribute(String name, Object o) Legger til et objekt i økten
2 getAttribute(String name) Henter et objekt fra økten
3 removeAttribute(String name) Fjerner et objekt fra økten

La oss skrive en servlet som summerer alle tallene som er sendt til den fra forskjellige forespørsler:

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

Er det noe annet vi ikke har sagt om HttpSession-objektet?

For det første er det navnet J SESSION ID. Det er under den sesjons-ID-en lagres i informasjonskapsler. Som du kan se, er det ganske enkelt å huske: J+SESSION+ID.

For det andre har økten noen flere nyttige metoder:

Metoder Beskrivelse
1 getAttributeNames() Returnerer en liste over alle nøkler som er lagret i økten
2 getId() Returnerer økt-ID-en (streng)
3 isNew() Returnerer sann hvis øktobjektet ble opprettet i gjeldende forespørsel
4 setMaxInactiveInterval(int seconds) Angir øktens inaktivitetsintervall i sekunder
5 invalidate() Fjerner alle objekter fra økten

Her er alle metodene åpenbare, men setMaxInactiveInterval()vi skal snakke om litt mer.

Hvis serveren lagrer titusenvis av økter, inkludert data fra klienter som besøkte den forrige måned, vil den ganske enkelt gå tom for minne. Derfor er det en måte å angi "øktens levetid".

Hvis ingen brukte økten i et tidsintervall, rydder den seg selv - alle objekter den har lagret blir slettet fra den. Dette gjøres for å spare minne.

Som standard er dette intervallet 1800 sekunder == 30 minutter. Hvis du setter verdien til -1, vil økten være "evig" og slettes bare når brukeren lukker nettleserfanen (vel, eller klienten kobler fra).

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