4.1 Wprowadzenie do HttpSession
Jeśli kilka żądań pochodzi od tego samego klienta, oznacza to, że między klientem a serwerem została ustanowiona sesja. Aby kontrolować ten proces, kontener posiada specjalny obiekt HttpSession.
Gdy klient wysyła żądanie do serwletu, kontener serwletu sprawdza, czy w żądaniu występuje parametr identyfikatora sesji. Jeśli nie ma takiego parametru (np. klient kontaktuje się z serwerem po raz pierwszy), wówczas kontener serwletu tworzy nowy obiekt HttpSession, a także przypisuje mu unikalny identyfikator.
Obiekt sesji jest przechowywany na serwerze, a identyfikator jest wysyłany w odpowiedzi do klienta i domyślnie jest przechowywany na kliencie w pliku cookie. Następnie, gdy nowe żądanie przychodzi od tego samego klienta, kontener serwletu pobiera od niego identyfikator i na podstawie tego identyfikatora znajduje właściwy obiekt HttpSession na serwerze.
Możesz pobrać obiekt sesji z żądania (obiekt HttpServletRequest), na którym musisz wywołać metodę getSession(). Zwraca obiekt HttpSession.
Dlaczego potrzebna jest sesja? Może przechowywać informacje o kliencie pomiędzy połączeniami. Ma w środku coś w rodzaju HashMapy, w której można przechowywać obiekty według kluczy. I kilka sposobów na to:
Metody | Opis | |
---|---|---|
1 | setAttribute(String name, Object o) |
Dodaje obiekt do sesji |
2 | getAttribute(String name) |
Pobiera obiekt z sesji |
3 | removeAttribute(String name) |
Usuwa obiekt z sesji |
Napiszmy serwlet, który zsumuje wszystkie liczby przekazane do niego z różnych żądań:
public class CalculatorServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// Pobierz atrybut „sum” z sesji
HttpSession session = request.getSession();
Integer sum = (Integer) session.getAttribute("sum");
//Obsługa sytuacji, gdy sesja nie posiada jeszcze takiego atrybutu
if (sum == null)
sum = 0;
// Pobierz parametr „n” z żądania
String n = request.getParameter("n");
sum += Integer.parseInt(n);
// Wpisz atrybut „sum” do sesji
session.setAttribute("sum", sum);
// Wydrukuj kod HTML jako odpowiedź dla przeglądarki
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 Więcej o HttpSession
Czy jest coś jeszcze, czego nie powiedzieliśmy o obiekcie HttpSession?
Po pierwsze, jest to nazwa J SESSION ID. To pod nim w plikach cookies przechowywany jest identyfikator sesji. Jak widać, jest to dość łatwe do zapamiętania: J+SESSION+ID
.
Po drugie, sesja ma jeszcze kilka przydatnych metod:
Metody | Opis | |
---|---|---|
1 | getAttributeNames() |
Zwraca listę wszystkich kluczy przechowywanych w sesji |
2 | getId() |
Zwraca identyfikator sesji (ciąg znaków) |
3 | isNew() |
Zwraca wartość true, jeśli obiekt sesji został utworzony w bieżącym żądaniu |
4 | setMaxInactiveInterval(int seconds) |
Ustawia interwał braku aktywności sesji w sekundach |
5 | invalidate() |
Usuwa wszystkie obiekty z sesji |
Tutaj wszystkie metody są oczywiste, ale setMaxInactiveInterval()
porozmawiamy o tym trochę więcej.
Jeśli serwer przechowuje dziesiątki tysięcy sesji, w tym dane klientów, którzy odwiedzili go w zeszłym miesiącu, po prostu zabraknie mu pamięci. Dlatego istnieje sposób na ustawienie „czasu życia sesji”.
Jeśli nikt nie korzystał z sesji przez określony czas, to się ona sama czyści - usuwane są z niej wszystkie przechowywane przez nią obiekty. Odbywa się to w celu oszczędzania pamięci.
Domyślnie ten interwał wynosi 1800 sekund == 30 minut. Jeśli ustawisz wartość -1, sesja będzie „wieczna” i zostanie usunięta tylko wtedy, gdy użytkownik zamknie kartę przeglądarki (cóż, lub klient się rozłączy).
Przykłady:
|
|
|
GO TO FULL VERSION