English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
I cookie sono file di testo memorizzati sul computer del client e conservano vari dati di tracciamento. Il Java Servlet supporta chiaramente i cookie HTTP.
Il riconoscimento dell'utente restituito include tre passaggi: }}
I script del server inviano un insieme di Cookie al browser. Ad esempio: nome, età o numero di identificazione.
Il browser memorizza queste informazioni sul computer locale per un utilizzo futuro.
Quando il browser invierà qualsiasi richiesta al server Web la prossima volta, invierà queste informazioni sui Cookie al server, che li utilizzerà per riconoscere l'utente.
Questo capitolo spiega come impostare o ripristinare i Cookie, come accedervi e come eliminarli.
Il trattamento dei Cookie nel Servlet richiede la codifica e decodifica dei caratteri cinesi, come segue:
String str = java.net.URLEncoder.encode("cinese", "UTF-8"); // Codifica String str = java.net.URLDecoder.decode("stringa codificata","UTF-8"); // Decodifica
I Cookie di solito vengono impostati nelle informazioni di intestazione HTTP (anche se JavaScript può impostare direttamente un Cookie nel browser). Il Servlet che imposta i Cookie invierà le seguenti informazioni di intestazione:
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=oldtoolbag.com Connection: close Content-Type: text/html
Come vedete, l'intestazione Set-Cookie contiene un nome valore, una data GMT, un percorso e un dominio. Il nome e il valore vengono codificati in URL. Il campo expires è un comando che informa il browser di 'dimenticare' il Cookie dopo la data e l'ora specificate.
Se il browser è configurato per memorizzare i Cookie, manterrà queste informazioni fino alla data di scadenza. Se il browser dell'utente si dirige verso una pagina che corrisponde al percorso e al dominio del Cookie, invierà nuovamente il Cookie al server. Le informazioni di intestazione del browser potrebbero apparire come segue:
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
Il Servlet può utilizzare il metodo di richiesta request.getCookies() Per accedere ai cookie, questo metodo restituirà un Cookie Array di oggetti.
Ecco una lista utile di metodi disponibili per manipolare i cookie nel Servlet.
Numero | Metodo & Descrizione |
---|---|
1 | public void setDomain(String pattern) Questa funzione imposta il dominio applicabile al cookie, ad esempio oldtoolbag.com. |
2 | public String getDomain() Questa funzione recupera il dominio applicabile al cookie, ad esempio oldtoolbag.com. |
3 | public void setMaxAge(int expiry) Questa funzione imposta il tempo di scadenza del cookie (in secondi). Se non impostato in questo modo, il cookie sarà valido solo per la sessione corrente. |
4 | public int getMaxAge() Questa funzione restituisce la durata massima di vita del cookie (in secondi), di default -1 indica che il cookie将持续到浏览器关闭。 |
5 | public String getName() Questa funzione restituisce il nome del cookie. Il nome non può essere modificato dopo la creazione. |
6 | public void setValue(String newValue) Questa funzione imposta il valore associato al cookie. |
7 | public String getValue() Questa funzione recupera il valore associato al cookie. |
8 | public void setPath(String uri) Questa funzione imposta il percorso applicabile ai cookie. Se non specifici un percorso, tutte le URL nel percorso corrente del sito (inclusi i sottopercorsi) restituiranno i cookie. |
9 | public String getPath() Questo metodo ottiene il percorso applicabile al cookie. |
10 | public void setSecure(boolean flag) Questo metodo imposta un valore booleano che indica se il cookie dovrebbe essere inviato solo su connessioni crittografate (cioè SSL). |
11 | public void setComment(String purpose) Imposta il commento del cookie. Questo commento è molto utile quando il browser presenta il cookie all'utente. |
12 | public String getComment() Ottieni il commento del cookie, se il cookie non ha un commento restituisce null. |
Impostare il Cookie tramite Servlet include tre passaggi:
(1) Crea un oggetto Cookie:Puoi chiamare il costruttore Cookie con il nome e il valore del cookie, sia il nome che il valore del cookie sono stringhe.
Cookie cookie = new Cookie("key","value");
Ricorda, sia il nome che il valore non dovrebbero contenere spazi o qualsiasi dei seguenti caratteri:
[ ] ( ) = , " / ? @ : ;
(2) Imposta la durata di vita massima:Puoi usare il metodo setMaxAge per specificare il tempo di validità del cookie (in secondi). Di seguito verrà impostato un cookie con una durata massima di 24 ore.
cookie.setMaxAge(60*60*24);
(3) Invia il Cookie nel header della risposta HTTP:Puoi usare response.addCookie per aggiungere il Cookie nel header della risposta HTTP, come segue:
response.addCookie(cookie);
Modifichiamo il nostro Esempio di dati del moduloimpostazione del Cookie per nome e cognome.
package com.w3codebox.test; import java.io.IOException; import java.io.PrintWriter; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Classe di implementazione Servlet HelloServlet */ @WebServlet("/HelloForm") public class HelloForm extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloForm() { super(); // TODO Stub costruttore generato automaticamente } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Creazione del Cookie per nome e cognome Nome cookie = new Cookie("name", URLEncoder.encode(request.getParameter("name"), "UTF-8")); // Codifica in cinese Cookie url = new Cookie("url", request.getParameter("url")); // Imposta la data di scadenza dei due Cookie a 24 ore dopo name.setMaxAge(60*60*24); url.setMaxAge(60*60*24); // Aggiungi due Cookie nella testa della risposta response.addCookie(name); response.addCookie(url); // Impostare il tipo di contenuto della risposta response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "Esempio di impostazione Cookie"; String docType = "<!DOCTYPE html>\n"; out.println(docType + "<html>\n" "<head><title>" + title + "</title></head>\n" "<body bgcolor="#f0f0f0">\n" "<h1 align="center">" + title + "</h1> " + "<ul> " + " <li><b>Nome del sito:</b> " + request.getParameter("name") + " </li>" + " <li><b>URL del sito:</b> " + request.getParameter("url") + " </li>" + "</ul> " + "</body></html>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
编译上面的 Servlet HelloForme crea un entry appropriato nel file web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <!-- Nome della classe --> <servlet-name>HelloForm</servlet-name> <!-- Pacchetto in cui si trova --> <servlet-class>com.w3codebox.test.HelloForm</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloForm</servlet-name> <!-- Indirizzo del sito visitato --> <url-pattern>/TomcatTest/HelloForm</url-pattern> </servlet-mapping> </web-app>
Ultimo tentativo di chiamare il Servlet utilizzando la seguente pagina HTML.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Web Tutorial (oldtoolbag.com)</title> </head> <body> <form action="/TomcatTest/HelloForm" method="GET"> Nome del sito: <input type="text" name="name"> <br/> URL del sito: <input type="text" name="url" /><br> <input type="submit" value="Invia" /> </form> </body> </html>
Salva il contenuto HTML sopra in un file /TomcatTest/test.html.
Procediamo a visitare http://localhost:8080/TomcatTest/test.html, come mostrato di seguito:
Dopo aver cliccato su "Invia", l'effetto sarà come segue:
Attenzione:Alcuni percorsi sopra elencati devono essere modificati in base al percorso effettivo del tuo progetto.
Per leggere i Cookie, devi chiamare HttpServletRequest di getCookies( ) metodo crea una javax.servlet.http.Cookie Array di oggetti. Poi eseguiamo un ciclo su questo array, utilizzando i metodi getName() e getValue() per accedere a ciascun cookie e al valore associato.
Lettura del Cookie impostato nell'esempio sopra.
package com.w3codebox.test; import java.io.IOException; import java.io.PrintWriter; import java.net.URLDecoder; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Classe di implementazione Servlet per ReadCookies */ @WebServlet("/ReadCookies") public class ReadCookies extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ReadCookies() { super(); // TODO Stub costruttore generato automaticamente } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = null; Cookie[] cookies = null; // Ottenere l'array di Cookie associati al dominio cookies = request.getCookies(); // Impostare il tipo di contenuto della risposta response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "Esempio di Eliminazione Cookie"; String docType = "<!DOCTYPE html>\n"; out.println(docType + "<html>\n" "<head><title>" + title + "</title></head>\n" "<body bgcolor="#f0f0f0">\n" if( cookies != null ){ out.println("<h2>Nome e valore del Cookie</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; if((cookie.getName()).compareTo("name") == 0){ cookie.setMaxAge(0); response.addCookie(cookie); out.print("Cookie eliminato: " + cookie.getName() + "<br/>"; } out.print("Nome del parametro: " + cookie.getName() + ","); out.print("Valore dei parametri: " + URLDecoder.decode(cookie.getValue(), "utf-8") + "<br/>"); } }else{ out.println( "<h2 class=\"tutheader\">No Cookie founds</h2>"); } out.println("</body>"); out.println("</html>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
编译上面的 Servlet ReadCookies, e crea una voce appropriata nel file web.xml. Prova a eseguire http://localhost:8080/TomcatTest/ReadCookies,将显示如下结果:
Eliminare un cookie è molto semplice. Se desideri eliminare un cookie, devi seguire questi tre passaggi:
Leggi un cookie esistente e salvalo nell'oggetto Cookie.
Usa setMaxAge() Il metodo imposta l'età del cookie a zero per eliminare il cookie esistente.
Aggiungi questo cookie all'intestazione della risposta.
Il seguente esempio eliminerà il cookie esistente chiamato "url", quando eseguirete nuovamente il Servlet ReadCookies, restituirà null per url.
package com.w3codebox.test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class DeleteCookies */ @WebServlet("/DeleteCookies") public class DeleteCookies extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public DeleteCookies() { super(); // TODO Stub costruttore generato automaticamente } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = null; Cookie[] cookies = null; // Ottenere l'array di Cookie associati al dominio cookies = request.getCookies(); // Impostare il tipo di contenuto della risposta response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "Esempio di eliminazione Cookie"; String docType = "<!DOCTYPE html>\n"; out.println(docType + "<html>\n" "<head><title>" + title + "</title></head>\n" "<body bgcolor="#f0f0f0">\n" if( cookies != null ){ out.println("<h2>Nome e valore del Cookie</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; if((cookie.getName()).compareTo("url") == 0 ){ cookie.setMaxAge(0); response.addCookie(cookie); out.print("Cookie eliminato: " + cookie.getName() + "<br/>"; } out.print("Nome del parametro: " + cookie.getName() + ","); out.print("参数值:" + cookie.getValue( )+" <br/>"); } }else{ out.println( "<h2 class=\"tutheader\">No Cookie founds</h2>"); } out.println("</body>"); out.println("</html>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
编译上面的 Servlet DeleteCookies,并在 web.xml 文件中创建适当的条目。现在运行 http://localhost:8080/TomcatTest/DeleteCookies,将显示如下结果: