Serwlety - obsługa plików cookie

Pliki cookie to pliki tekstowe przechowywane na komputerze klienta i przechowywane w celu śledzenia różnych informacji. Java Servlets w przejrzysty sposób obsługuje pliki cookie HTTP.

Identyfikacja powracających użytkowników obejmuje trzy kroki -

  • Skrypt serwera wysyła zestaw plików cookie do przeglądarki. Na przykład imię i nazwisko, wiek lub numer identyfikacyjny itp.

  • Przeglądarka przechowuje te informacje na komputerze lokalnym do wykorzystania w przyszłości.

  • Gdy przeglądarka następnym razem wyśle ​​jakiekolwiek żądanie do serwera internetowego, wysyła te informacje o plikach cookie do serwera, a serwer wykorzystuje te informacje do identyfikacji użytkownika.

W tym rozdziale dowiesz się, jak ustawić lub zresetować pliki cookie, jak uzyskać do nich dostęp i jak je usunąć.

Anatomia pliku cookie

Pliki cookie są zwykle umieszczane w nagłówku HTTP (chociaż JavaScript może również ustawić plik cookie bezpośrednio w przeglądarce). Aplet ustawiający plik cookie może wysyłać nagłówki wyglądające mniej więcej tak:

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name = xyz; expires = Friday, 04-Feb-07 22:03:38 GMT; 
   path = /; domain = tutorialspoint.com
Connection: close
Content-Type: text/html

Jak widać, nagłówek Set-Cookie zawiera parę nazwa-wartość, datę GMT, ścieżkę i domenę. Nazwa i wartość będą zakodowane w postaci adresu URL. Pole wygaśnięcia jest instrukcją dla przeglądarki, aby „zapomniała” plik cookie po określonej godzinie i dacie.

Jeśli przeglądarka jest skonfigurowana do przechowywania plików cookie, będzie przechowywać te informacje do daty wygaśnięcia. Jeśli użytkownik skieruje przeglądarkę na dowolną stronę, która jest zgodna ze ścieżką i domeną pliku cookie, wyśle ​​plik cookie ponownie na serwer. Nagłówki przeglądarki mogą wyglądać mniej więcej tak -

GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name = xyz

Aplet będzie miał wtedy dostęp do ciasteczka za pośrednictwem metody request.getCookies (), która zwraca tablicę obiektów Cookie .

Metody plików cookie serwletu

Poniżej znajduje się lista przydatnych metod, z których można korzystać podczas manipulowania plikami cookie w serwlecie.

Sr.No. Metoda i opis
1

public void setDomain(String pattern)

Ta metoda ustawia domenę, do której ma zastosowanie plik cookie, na przykład tutorialspoint.com.

2

public String getDomain()

Ta metoda pobiera domenę, której dotyczy plik cookie, na przykład tutorialspoint.com.

3

public void setMaxAge(int expiry)

Ta metoda określa, ile czasu (w sekundach) powinno upłynąć, zanim plik cookie wygaśnie. Jeśli tego nie ustawisz, plik cookie będzie trwał tylko podczas bieżącej sesji.

4

public int getMaxAge()

Ta metoda zwraca maksymalny wiek pliku cookie, określony w sekundach, domyślnie -1, co oznacza, że ​​plik cookie będzie trwał do zamknięcia przeglądarki.

5

public String getName()

Ta metoda zwraca nazwę pliku cookie. Nazwy nie można zmienić po utworzeniu.

6

public void setValue(String newValue)

Ta metoda ustawia wartość skojarzoną z plikiem cookie

7

public String getValue()

Ta metoda pobiera wartość skojarzoną z plikiem cookie.

8

public void setPath(String uri)

Ta metoda określa ścieżkę, do której odnosi się ten plik cookie. Jeśli nie określisz ścieżki, plik cookie jest zwracany dla wszystkich adresów URL w tym samym katalogu, co bieżąca strona, a także dla wszystkich podkatalogów.

9

public String getPath()

Ta metoda pobiera ścieżkę, do której odnosi się ten plik cookie.

10

public void setSecure(boolean flag)

Ta metoda ustawia wartość logiczną wskazującą, czy plik cookie powinien być wysyłany tylko za pośrednictwem połączeń szyfrowanych (tj. SSL).

11

public void setComment(String purpose)

Ta metoda określa komentarz opisujący przeznaczenie pliku cookie. Komentarz jest przydatny, jeśli przeglądarka wyświetla plik cookie użytkownikowi.

12

public String getComment()

Ta metoda zwraca komentarz opisujący cel tego pliku cookie lub null, jeśli plik cookie nie ma komentarza.

Ustawianie plików cookie za pomocą serwletu

Ustawienie plików cookie za pomocą serwletu obejmuje trzy kroki -

(1) Creating a Cookie object - Wywołujesz konstruktor Cookie z nazwą pliku cookie i wartością pliku cookie, z których oba są ciągami.

Cookie cookie = new Cookie("key","value");

Pamiętaj, że ani nazwa, ani wartość nie powinny zawierać spacji ani żadnego z następujących znaków -

[ ] ( ) = , " / ? @ : ;

(2) Setting the maximum age- Używasz setMaxAge, aby określić, jak długo (w sekundach) plik cookie powinien być ważny. Następujące utworzy plik cookie na 24 godziny.

cookie.setMaxAge(60 * 60 * 24);

(3) Sending the Cookie into the HTTP response headers - Używasz response.addCookie do dodawania plików cookie w nagłówku odpowiedzi HTTP w następujący sposób -

response.addCookie(cookie);

Przykład

Zmodyfikujmy nasz Przykład formularza, aby ustawić pliki cookie dla imienia i nazwiska.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class HelloForm extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Create cookies for first and last names.      
      Cookie firstName = new Cookie("first_name", request.getParameter("first_name"));
      Cookie lastName = new Cookie("last_name", request.getParameter("last_name"));

      // Set expiry date after 24 Hrs for both the cookies.
      firstName.setMaxAge(60*60*24);
      lastName.setMaxAge(60*60*24);

      // Add both the cookies in the response header.
      response.addCookie( firstName );
      response.addCookie( lastName );

      // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "Setting Cookies Example";
      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" +
               "<ul>\n" +
                  "  <li><b>First Name</b>: "
                  + request.getParameter("first_name") + "\n" +
                  "  <li><b>Last Name</b>: "
                  + request.getParameter("last_name") + "\n" +
               "</ul>\n" +
            "</body>
         </html>"
      );
   }
}

Skompiluj powyższy serwlet HelloForm i utwórz odpowiedni wpis w pliku web.xml i na koniec spróbuj skorzystać ze strony HTML, aby wywołać serwlet.

<html>
   <body>
      <form action = "HelloForm" method = "GET">
         First Name: <input type = "text" name = "first_name">
         <br />
         Last Name: <input type = "text" name = "last_name" />
         <input type = "submit" value = "Submit" />
      </form>
   </body>
</html>

Zachowaj powyższą zawartość HTML w pliku Hello.htm i umieść ją w katalogu <Tomcat-installationdirectory> / webapps / ROOT. Jeśli chcesz uzyskać dostęp do http: // localhost: 8080 / Hello.htm , oto rzeczywiste dane wyjściowe powyższego formularza.

Spróbuj wpisać imię i nazwisko, a następnie kliknij przycisk przesyłania. Spowoduje to wyświetlenie na ekranie imienia i nazwiska oraz ustawienie dwóch plików cookie firstName i lastName, które zostaną przesłane z powrotem do serwera, gdy następnym razem naciśniesz przycisk Prześlij.

W następnej sekcji wyjaśniono, w jaki sposób można uzyskać dostęp do tych plików cookie w swojej aplikacji internetowej.

Czytanie plików cookie za pomocą serwletu

Aby odczytać pliki cookie, musisz utworzyć tablicę obiektów javax.servlet.http.Cookie , wywołując metodęgetCookies()metoda HttpServletRequest . Następnie przejdź przez tablicę i użyj metod getName () i getValue (), aby uzyskać dostęp do każdego pliku cookie i skojarzonej wartości.

Przykład

Przeczytajmy pliki cookie, które ustawiliśmy w poprzednim przykładzie -

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class ReadCookies extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      Cookie cookie = null;
      Cookie[] cookies = null;

      // Get an array of Cookies associated with this domain
      cookies = request.getCookies();

      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Reading Cookies Example";
      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" );

      if( cookies != null ) {
         out.println("<h2> Found Cookies Name and Value</h2>");

         for (int i = 0; i < cookies.length; i++) {
            cookie = cookies[i];
            out.print("Name : " + cookie.getName( ) + ",  ");
            out.print("Value: " + cookie.getValue( ) + " <br/>");
         }
      } else {
         out.println("<h2>No cookies founds</h2>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

Skompiluj powyżej serwletu ReadCookiesi utwórz odpowiedni wpis w pliku web.xml. Jeśli ustawisz plik cookie first_name jako „John”, a plik cookie last_name jako „Player”, uruchomienie http: // localhost: 8080 / ReadCookies spowoduje wyświetlenie następującego wyniku -

Found Cookies Name and Value

Name : first_name, Value: John
Name : last_name, Value: Player

Usuń pliki cookie za pomocą serwletu

Usunięcie plików cookie jest bardzo proste. Jeśli chcesz usunąć plik cookie, wystarczy wykonać następujące trzy kroki -

  • Przeczytaj już istniejący plik cookie i zapisz go w obiekcie Cookie.

  • Ustaw wiek plików cookie na zero za pomocą setMaxAge() metoda usunięcia istniejącego pliku cookie

  • Dodaj ten plik cookie z powrotem do nagłówka odpowiedzi.

Przykład

Poniższy przykład spowoduje usunięcie istniejącego pliku cookie o nazwie „imię_nazwa”, a przy następnym uruchomieniu serwletu ReadCookies zwróci on wartość null dla first_name.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class DeleteCookies extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      Cookie cookie = null;
      Cookie[] cookies = null;
         
      // Get an array of Cookies associated with this domain
      cookies = request.getCookies();

      // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "Delete Cookies Example";
      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" );
         
      if( cookies != null ) {
         out.println("<h2> Cookies Name and Value</h2>");

         for (int i = 0; i < cookies.length; i++) {
            cookie = cookies[i];

            if((cookie.getName( )).compareTo("first_name") == 0 ) {
               cookie.setMaxAge(0);
               response.addCookie(cookie);
               out.print("Deleted cookie : " + cookie.getName( ) + "<br/>");
            }
            out.print("Name : " + cookie.getName( ) + ",  ");
            out.print("Value: " + cookie.getValue( )+" <br/>");
         }
      } else {
         out.println("<h2>No cookies founds</h2>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

Skompiluj powyżej serwletu DeleteCookiesi utwórz odpowiedni wpis w pliku web.xml. Uruchomienie http: // localhost: 8080 / DeleteCookies spowoduje wyświetlenie następującego wyniku -

Cookies Name and Value

Deleted cookie : first_name

Name : first_name, Value: John

Name : last_name, Value: Player

Teraz spróbuj uruchomić http: // localhost: 8080 / ReadCookies i wyświetli tylko jeden plik cookie w następujący sposób -

Found Cookies Name and Value

Name : last_name, Value: Player

Możesz ręcznie usunąć pliki cookie w przeglądarce Internet Explorer. Rozpocznij w menu Narzędzia i wybierz Opcje internetowe. Aby usunąć wszystkie pliki cookie, naciśnij Usuń pliki cookie.