English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Gestione dei cookie JSP

I cookie sono file di testo memorizzati sul client che contengono molte tracce di informazioni. Sulla base della tecnologia Servlet, JSP può ovviamente fornire supporto per i cookie HTTP.

Di solito ci sono tre passaggi per riconoscere i clienti di ritorno:

  •             Il script del server invia una serie di cookie al browser. Ad esempio, nome, età, numero di identificazione, ecc.

  •             Il browser memorizza queste informazioni sul computer locale per eventuali necessità future.

  •             Quando il browser invia qualsiasi richiesta al server la prossima volta, invierà anche queste informazioni sui cookie al server, che li utilizzerà per riconoscere l'utente o fare altre cose.

Questa sezione ti insegnerà come impostare o ripristinare i cookie, come accedervi e come eliminarli.

Il trattamento dei cookie in JSP 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

Analisi dei cookie

I cookie vengono solitamente impostati nella intestazione dell'informazione HTTP (sebbene JavaScript possa impostare i cookie direttamente nel browser). In JSP, per impostare un cookie è necessario inviare all'hoster l'intestazione dell'informazione come segue:

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

Come vedete, l'intestazione Set-Cookie contiene un paio di chiavi e valori, un orario GMT (Greenwich Mean Time), un percorso e un dominio. Il paio di chiavi e valori viene codificato come URL. L'indicazione della durata del dominio è un comando che informa il browser quando può cancellare questo cookie.

Se il browser è configurato per memorizzare i cookie, questi verranno conservati fino alla scadenza. Se l'utente accede a qualsiasi pagina che corrisponde al percorso e al dominio del cookie, il browser invierà nuovamente questo cookie al server. L'intestazione delle informazioni del browser appare così:

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

Le script JSP accedono a questi cookie tramite il metodo getCookies() dell'oggetto request, che restituisce un array di oggetti Cookie.

    Metodi Servlet Cookie

La tabella seguente elenca i metodi comuni dell'oggetto Cookie:

NumeroMetodo & Descrizione
                1public void setDomain(String pattern) Imposta il dominio del cookie, ad esempio oldtoolbag.com
                2public String getDomain() Ottieni il dominio del cookie, ad esempio oldtoolbag.com
                3public void setMaxAge(int expiry) Imposta la durata di validità del cookie in secondi, il valore predefinito è la durata di vita della sessione corrente
                4public int getMaxAge() Ottieni la durata di validità del cookie in secondi, il valore predefinito è -1, il che indica che il cookie rimarrà attivo fino alla chiusura del browser
                5public String getName() 返回 cookie 的名称,名称创建后将不能被修改
                6public void setValue(String newValue) 设置 cookie 的值
                7public String getValue() 获取cookie的值
                8public void setPath(String uri) 设置 cookie 的路径,默认为当前页面目录下的所有 URL,还有此目录下的所有子目录
                9public String getPath() 获取 cookie 的路径
                10public void setSecure(boolean flag) 指明 cookie 是否要加密传输
                11public void setComment(String purpose) 设置注释描述 cookie 的目的。当浏览器将 cookie 展现给用户时,注释将会变得非常有用
                12public String getComment() 返回描述 cookie 目的的注释,若没有则返回 null

使用 JSP 设置 cookie

使用 JSP 设置 cookie 包含三个步骤:

(1)创建一个 cookie 对象: 调用 cookie 的构造函数,使用一个 cookie 名称和值做参数,它们都是字符串。

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

请务必牢记,名称和值中都不能包含空格或者如下的字符:

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

(2) 设置有效期:调用 setMaxAge() 函数表明 cookie 在多长时间(以秒为单位)内有效。下面的操作将有效期设为了 24 小时。

cookie.setMaxAge(60*60*24);

(3) 将 cookie 发送至 HTTP 响应头中:调用 response.addCookie() 函数来向 HTTP 响应头中添加 cookie。

response.addCookie(cookie);

Esempio dimostrativo

main.jsp 文件代码如下所示:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<%
   // 编码,解决中文乱码   
   String str = URLEncoder.encode(request.getParameter("name"),"utf-8");  
   // 设置 name 和 url cookie 
   Cookie name = new Cookie("name",
           str);
   Cookie url = new Cookie("url",
              request.getParameter("url));
   // Imposta il tempo di scadenza del cookie a 24 ore.
   name.setMaxAge(60*60*24); 
   url.setMaxAge(60*60*24); 
   // Aggiungi cookie nella risposta header
   response.addCookie(name);
   response.addCookie(url);
%>
<html>
<head>
<title>Imposta Cookie</title>
</head>
<body>
<h1>Imposta Cookie</h1>
<ul>
<li><p><b>Nome del sito:</b>
   <%= request.getParameter("name") %>
</p></li>
<li><p><b>Indirizzo del sito:</b>
   <%= request.getParameter("url") %>
</p></li>
</ul>
</body>
</html>

Di seguito è riportato un semplice modulo HTML che utilizza il metodo GET per inviare i dati del client al file main.jsp e impostare i cookie:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Base Tutorial Site (oldtoolbag.com)</title>
</head>
<body>
<form action="main.jsp" method=GET>
Nome del sito: <input type="text" name="name">
<br />
Indirizzo del sito: <input type="text" name="url" />
<input type="submit" value="Invia" />
</form>
</body>
</html>

Salva il codice HTML sopra nel file test.htm.

Posiziona il file nella directory WebContent del progetto jsp corrente (nella stessa directory di main.jsp).

Invia i dati del modulo a main.jsp tramite http://localhost:8080/testjsp/test.html, come segue:

Prova a inserire "Nome del sito" e "Indirizzo del sito" e poi clicca sul pulsante Invia, verranno visualizzati nel tuo schermo "Nome del sito" e "Indirizzo del sito", e verranno impostati due cookie per "Nome del sito" e "Indirizzo del sito".

Leggi i Cookie con JSP

Per leggere i cookies, bisogna chiamare il metodo request.getCookies() per ottenere un array di oggetti javax.servlet.http.Cookie, quindi esaminare l'array, usando i metodi getName() e getValue() per ottenere il nome e il valore di ogni cookie。

Esempio dimostrativo

Vediamo come leggere i cookies dell'esempio precedente, qui è il codice del file cookie.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> Ottenere Cookie</title>
</head>
<body>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // Ottenere i dati dei cookies, è un array
   cookies = request.getCookies();
   se cookies != null ){
      out.println("<h2> Ricerca Nome e Valore Cookie</h2>");
      per (int i = 0; i < cookies.length; i++){
         cookie = cookies[i];
        
         out.print("Nome del parametro: " + cookie.getName());
         out.print("<br>");
         out.print("Valore del parametro: " + URLDecoder.decode(cookie.getValue(), "utf-8") + "<br>");
         out.print("------------------------------------<br>");
      }
  }
      out.println("<h2>Non è stato trovato un Cookie</h2>");
  }
%>
</body>
</html>

Dopo l'accesso del browser, i risultati di output sono:

    Eliminare cookie con JSP

Eliminare un cookie è molto semplice. Se vuoi eliminare un cookie, seguisci i passaggi seguenti:

  •             Ottenere un cookie esistente e salvarlo in un oggetto Cookie.

  •             Impostare la durata di validità del cookie a 0.

  •             Aggiungere nuovamente questo cookie nelle risposte del header.

Esempio dimostrativo

Il seguente programma elimina un cookie con il nome "name",quando eseguite per la seconda volta cookie.jsp,name sarà null。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> Ottenere Cookie</title>
</head>
<body>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // Ottenere i cookies del dominio corrente,è un array
   cookies = request.getCookies();
   se cookies != null ){
      out.println("<h2> Ricerca Nome e Valore Cookie</h2>");
      per (int i = 0; i < cookies.length; i++){
         cookie = cookies[i];
         se ((cookie.getName( )).compareTo("name") == 0 ){
            cookie.setMaxAge(0);
            response.addCookie(cookie);
            out.print("Elimina Cookie: " + 
            cookie.getName() + "<br/>");
         }
         out.print("Nome del parametro: " + cookie.getName());
         out.print("<br>");
         out.print("Valore del parametro: " + URLDecoder.decode(cookie.getValue(), "utf-8") + "<br>");
         out.print("------------------------------------<br>");
      }
  }
      out.println("<h2>Non è stato trovato un Cookie</h2>");
  }
%>
</body>
</html>

Accedi tramite il browser e l'output sarà:

Torna a visitare http://localhost:8080/testjsp/cookie.jsp e ottieni i seguenti risultati:

Vedi che il cookie chiamato "name" è scomparso.

Puoi anche eliminare manualmente i cookie nel browser. Nella versione IE, clicca su Strumenti nel menu, quindi seleziona Opzioni Internet, clicca su Elimina cookie per eliminare tutti i cookie.