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:
|
|
|
GO TO FULL VERSION