Serwlety - śledzenie sesji

HTTP jest protokołem „bezstanowym”, co oznacza, że ​​za każdym razem, gdy klient pobiera stronę internetową, klient otwiera oddzielne połączenie z serwerem internetowym, a serwer automatycznie nie przechowuje żadnego zapisu poprzedniego żądania klienta.

Nadal istnieją trzy sposoby utrzymywania sesji między klientem WWW a serwerem WWW -

Ciasteczka

Serwer sieciowy może przypisać unikalny identyfikator sesji jako plik cookie do każdego klienta WWW, a przy kolejnych żądaniach klienta można je rozpoznać za pomocą otrzymanego pliku cookie.

Może to nie być skuteczny sposób, ponieważ często przeglądarka nie obsługuje plików cookie, więc nie polecam korzystania z tej procedury w celu utrzymania sesji.

Ukryte pola formularzy

Serwer sieciowy może wysłać ukryte pole formularza HTML wraz z unikalnym identyfikatorem sesji w następujący sposób -

<input type = "hidden" name = "sessionid" value = "12345">

Ten wpis oznacza, że ​​po przesłaniu formularza określona nazwa i wartość są automatycznie uwzględniane w danych GET lub POST. Za każdym razem, gdy przeglądarka internetowa odsyła żądanie, wartość session_id może służyć do śledzenia różnych przeglądarek internetowych.

Może to być skuteczny sposób na śledzenie sesji, ale kliknięcie zwykłego (<A HREF...>) łącza hipertekstowego nie powoduje wysłania formularza, więc ukryte pola formularzy również nie obsługują ogólnego śledzenia sesji.

Przepisywanie adresów URL

Na końcu każdego adresu URL można dołączyć dodatkowe dane identyfikujące sesję, a serwer może powiązać ten identyfikator sesji z przechowywanymi danymi dotyczącymi tej sesji.

Na przykład w przypadku http://tutorialspoint.com/file.htm;sessionid = 12345 identyfikator sesji jest dołączony jako sessionid = 12345, do którego można uzyskać dostęp na serwerze sieciowym w celu identyfikacji klienta.

Przepisywanie adresów URL to lepszy sposób na utrzymanie sesji i działa nawet wtedy, gdy przeglądarki nie obsługują plików cookie. Wadą ponownego zapisywania adresu URL jest to, że każdy adres URL musiałby być generowany dynamicznie, aby przypisać identyfikator sesji, nawet w przypadku prostej statycznej strony HTML.

Obiekt HttpSession

Oprócz wyżej wymienionych trzech sposobów, serwlet udostępnia interfejs HttpSession, który umożliwia identyfikację użytkownika w ramach więcej niż jednego żądania strony lub wizyty w witrynie sieci Web oraz przechowywanie informacji o tym użytkowniku.

Kontener serwletów używa tego interfejsu do tworzenia sesji między klientem HTTP a serwerem HTTP. Sesja trwa przez określony czas, w ramach więcej niż jednego połączenia lub żądania strony wysłanego przez użytkownika.

Otrzymasz obiekt HttpSession, wywołując metodę publiczną getSession() z HttpServletRequest, jak poniżej -

HttpSession session = request.getSession();

Musisz wywołać request.getSession () zanim wyślesz jakąkolwiek treść dokumentu do klienta. Oto podsumowanie ważnych metod dostępnych przez obiekt HttpSession -

Sr.No. Metoda i opis
1

public Object getAttribute(String name)

Ta metoda zwraca obiekt powiązany z określoną nazwą w tej sesji lub null, jeśli żaden obiekt nie jest powiązany z nazwą.

2

public Enumeration getAttributeNames()

Ta metoda zwraca Enumeration of String obiektów zawierających nazwy wszystkich obiektów powiązanych z tą sesją.

3

public long getCreationTime()

Ta metoda zwraca czas utworzenia sesji, mierzony w milisekundach od północy 1 stycznia 1970 GMT.

4

public String getId()

Ta metoda zwraca ciąg zawierający unikatowy identyfikator przypisany do tej sesji.

5

public long getLastAccessedTime()

Ta metoda zwraca czas ostatniego dostępu do sesji w formacie milisekund od północy 1 stycznia 1970 GMT

6

public int getMaxInactiveInterval()

Ta metoda zwraca maksymalny odstęp czasu (w sekundach), w którym kontener serwletu będzie utrzymywał otwartą sesję między dostępami klienta.

7

public void invalidate()

Ta metoda unieważnia tę sesję i usuwa powiązania wszystkich obiektów z nią związanych.

8

public boolean isNew(

Ta metoda zwraca wartość true, jeśli klient nie wie jeszcze o sesji lub jeśli zdecyduje się nie dołączać do sesji.

9

public void removeAttribute(String name)

Ta metoda usuwa obiekt powiązany z określoną nazwą z tej sesji.

10

public void setAttribute(String name, Object value)

Ta metoda wiąże obiekt z tą sesją przy użyciu określonej nazwy.

11

public void setMaxInactiveInterval(int interval)

Ta metoda określa czas w sekundach między żądaniami klientów, zanim kontener serwletów unieważni sesję.

Przykład śledzenia sesji

W tym przykładzie opisano, jak używać obiektu HttpSession, aby znaleźć czas utworzenia i ostatni dostęp do sesji. Skojarzymy nową sesję z żądaniem, jeśli jeszcze nie istnieje.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
         
      // Create a session object if it is already not  created.
      HttpSession session = request.getSession(true);
         
      // Get session creation time.
      Date createTime = new Date(session.getCreationTime());
         
      // Get last access time of this web page.
      Date lastAccessTime = new Date(session.getLastAccessedTime());

      String title = "Welcome Back to my website";
      Integer visitCount = new Integer(0);
      String visitCountKey = new String("visitCount");
      String userIDKey = new String("userID");
      String userID = new String("ABCD");

      // Check if this is new comer on your web page.
      if (session.isNew()) {
         title = "Welcome to my website";
         session.setAttribute(userIDKey, userID);
      } else {
         visitCount = (Integer)session.getAttribute(visitCountKey);
         visitCount = visitCount + 1;
         userID = (String)session.getAttribute(userIDKey);
      }
      session.setAttribute(visitCountKey,  visitCount);

      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " +
         "transitional//en\">\n";

      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<h2 align = \"center\">Session Infomation</h2>\n" +
               "<table border = \"1\" align = \"center\">\n" +
                  
                  "<tr bgcolor = \"#949494\">\n" +
                     "  <th>Session info</th><th>value</th>
                  </tr>\n" +
                     
                  "<tr>\n" +
                     "  <td>id</td>\n" +
                     "  <td>" + session.getId() + "</td>
                  </tr>\n" +
                  
                  "<tr>\n" +
                     "  <td>Creation Time</td>\n" +
                     "  <td>" + createTime + "  </td>
                  </tr>\n" +
                  
                  "<tr>\n" +
                     "  <td>Time of Last Access</td>\n" +
                     "  <td>" + lastAccessTime + "  </td>
                  </tr>\n" +
                  
                  "<tr>\n" +
                     "  <td>User ID</td>\n" +
                     "  <td>" + userID + "  </td>
                  </tr>\n" +
                  
                  "<tr>\n" +
                     "  <td>Number of visits</td>\n" +
                     "  <td>" + visitCount + "</td>
                  </tr>\n" +
               "</table>\n" +
            "</body>
         </html>"
      );
   }
}

Skompiluj powyższy serwlet SessionTracki utwórz odpowiedni wpis w pliku web.xml. Teraz uruchomienie http: // localhost: 8080 / SessionTrack spowoduje wyświetlenie następującego wyniku, gdy uruchomisz go po raz pierwszy -

Welcome to my website

Session Infomation

Session info value
id 0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access Tue Jun 08 17:26:40 GMT+04:00 2010
User ID ABCD
Number of visits 0

Teraz spróbuj uruchomić ten sam serwlet po raz drugi, wyświetli się następujący wynik.

Welcome Back to my website

Session Infomation

info type value
id 0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access Tue Jun 08 17:26:40 GMT+04:00 2010
User ID ABCD
Number of visits 1

Usuwanie danych sesji

Gdy skończysz z danymi sesji użytkownika, masz kilka opcji -

  • Remove a particular attribute- Możesz wywołać metodę public void removeAttribute (nazwa ciągu) , aby usunąć wartość skojarzoną z określonym kluczem.

  • Delete the whole session- Możesz wywołać metodę public void invalidate () , aby odrzucić całą sesję.

  • Setting Session timeout- Możesz wywołać metodę public void setMaxInactiveInterval (int interval) , aby indywidualnie ustawić limit czasu dla sesji.

  • Log the user out - Serwery obsługujące serwlety 2.4, możesz zadzwonić logout aby wylogować klienta z serwera WWW i unieważnić wszystkie sesje należące do wszystkich użytkowników.

  • web.xml Configuration - Jeśli używasz Tomcata, oprócz wyżej wymienionych metod, możesz skonfigurować limit czasu sesji w pliku web.xml w następujący sposób.

<session-config>
   <session-timeout>15</session-timeout>
</session-config>

Limit czasu jest wyrażany w minutach i zastępuje domyślny limit czasu, który w Tomcat wynosi 30 minut.

Metoda getMaxInactiveInterval () w serwlecie zwraca limit czasu dla tej sesji w sekundach. Więc jeśli sesja jest skonfigurowana w web.xml przez 15 minut, getMaxInactiveInterval () zwraca 900.