4.1 A HttpSession bemutatása
Ha több kérés érkezik ugyanattól a klienstől, akkor azt mondják, hogy munkamenet jött létre a kliens és a szerver között. Ennek a folyamatnak a vezérléséhez a tároló egy speciális HttpSession objektummal rendelkezik.
Amikor egy ügyfél kérést intéz egy szervlethez, a szervlet-tároló ellenőrzi, hogy a munkamenet-azonosító paraméter szerepel-e a kérésben. Ha nincs ilyen paraméter (például a kliens először lép kapcsolatba a szerverrel), akkor a servlet-tároló létrehoz egy új HttpSession objektumot, és hozzárendel egy egyedi azonosítót is.
A munkamenet objektumot a szerver tárolja, és az azonosítót válaszként küldi el a kliensnek, és alapértelmezés szerint a kliens egy cookie-ban tárolja. Ezután, amikor új kérés érkezik ugyanattól a klienstől, a servlet-tároló lekéri tőle az azonosítót, és ezzel az azonosítóval megtalálja a megfelelő HttpSession objektumot a kiszolgálón.
A session objektumot lekérheti egy kérésből (egy HttpServletRequest objektumból), amelyen meg kell hívnia a getSession() metódust. Egy HttpSession objektumot ad vissza.
Miért van szükség egy ülésre? A hívások között információkat tárolhat az ügyfélről. Valami HashMap-hez hasonló van benne, amelyben kulcsok alapján tárolhatja az objektumokat. És néhány módszer erre:
Mód | Leírás | |
---|---|---|
1 | setAttribute(String name, Object o) |
Objektumot ad a munkamenethez |
2 | getAttribute(String name) |
Lekér egy objektumot a munkamenetből |
3 | removeAttribute(String name) |
Eltávolít egy objektumot a munkamenetből |
Írjunk egy servletet, amely összegzi a különböző kérésekből neki átadott összes számot:
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 További információ a HttpSessionról
Van még valami, amit nem mondtunk el a HttpSession objektumról?
Először is ez a J SESSION ID név. Ez alatt tárolódik a munkamenet-azonosító a cookie-kban. Amint látja, elég könnyű megjegyezni: J+SESSION+ID
.
Másodszor, a munkamenetnek van még néhány hasznos módszere:
Mód | Leírás | |
---|---|---|
1 | getAttributeNames() |
A munkamenetben tárolt összes kulcs listáját adja vissza |
2 | getId() |
Visszaadja a munkamenet azonosítóját (karakterlánc) |
3 | isNew() |
Igaz értéket ad vissza, ha a munkamenet objektumot az aktuális kérésben hozták létre |
4 | setMaxInactiveInterval(int seconds) |
Beállítja a munkamenet inaktivitási intervallumát másodpercben |
5 | invalidate() |
Eltávolítja az összes objektumot a munkamenetből |
Itt minden módszer nyilvánvaló, de setMaxInactiveInterval()
egy kicsit többet fogunk beszélni.
Ha a szerver több tízezer munkamenetet tárol, beleértve a múlt hónapban látogató ügyfelek adatait is, akkor egyszerűen elfogy a memóriája. Ezért van mód a „munkamenet élettartamának” beállítására.
Ha egy ideig senki sem használta a munkamenetet, akkor törli magát - az összes tárolt objektum törlődik belőle. Ez a memória megtakarítása érdekében történik.
Alapértelmezés szerint ez az intervallum 1800 másodperc == 30 perc. Ha az értéket -1-re állítja, akkor a munkamenet „örök” lesz, és csak akkor törlődik, ha a felhasználó bezárja a böngésző lapot (vagy a kliens megszakítja a kapcsolatot).
Példák:
|
|
|
GO TO FULL VERSION