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/htmlJak 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 = xyzAplet 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: PlayerUsuń 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: PlayerMoż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.