Latest web development tutorials

Servlet Cookie Processing

Cookie è un file di testo memorizzato sul computer client, e mantiene una serie di informazioni di rilevamento. Java Servlet chiaramente il supporto dei cookie HTTP.

Restituisce l'identificazione dell'utente prevede tre passaggi:

  • lo script server invia un cookie al browser. Per esempio: nome, l'età o il numero di identificazione.
  • Il browser memorizza queste informazioni sul computer locale per un utilizzo futuro.
  • La prossima volta che il browser invia una richiesta a un server Web, il browser invierà le informazioni del cookie al server, il server utilizzerà queste informazioni per identificare gli utenti.

Questo capitolo spiega come impostare o ripristinare Cookie, come accedervi, e come rimuoverli.

Servlet Cookie esigenze di elaborazione di codificare e decodificare cinese, come segue:

String   str   =   java.net.URLEncoder.encode("中文");            //编码
String   str   =   java.net.URLDecoder.decode("编码后的字符串");   // 解码

Analisi del biscotto

Cookie è di solito impostato nelle informazioni di intestazione HTTP (anche se JavaScript può anche essere impostata direttamente in un browser cookie). Impostazione del Servlet cookie inviare la seguente 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=w3cschool.cc
Connection: close
Content-Type: text/html

Come si può vedere, intestazione Set-Cookie contiene una coppia di valori nome, una data GMT, un percorso e un dominio. Il nome e il valore sarà URL codificati. scade campo è un'istruzione che indica al browser dopo una certa data e l'ora di "dimenticare" il cookie.

Se il browser è configurato per memorizzare cookie, manterrà questa informazione fino alla data di scadenza. Se il browser dell'utente per adattarsi a qualsiasi del dominio di cookie e il percorso della pagina, che si ri-inviare il cookie al server. informazioni di intestazione del browser potrebbe essere il seguente:

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

Servlet può accedere da Cookie metodo della richiestarequest.getCookies (),che restituisce un array di oggettiCookie.

Servlet Metodi Cookie

Di seguito è riportato un elenco dei metodi utili quando si opera in un Servlet cookie può essere utilizzato.

序号方法 & 描述
1public void setDomain(String pattern)
该方法设置 cookie 适用的域,例如 w3cschool.cc。
2public String getDomain()
该方法获取 cookie 适用的域,例如 w3cschool.cc。
3public void setMaxAge(int expiry)
该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。
4public int getMaxAge()
该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。
5public String getName()
该方法返回 cookie 的名称。名称在创建后不能改变。
6public void setValue(String newValue)
该方法设置与 cookie 关联的值。
7public String getValue()
该方法获取与 cookie 关联的值。
8public void setPath(String uri)
该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。
9public String getPath()
该方法获取 cookie 适用的路径。
10public void setSecure(boolean flag)
该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。
11public void setComment(String purpose)
设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。
12public String getComment()
获取 cookie 的注释,如果 cookie 没有注释则返回 null。

Impostazioni cookie tramite Servlet

Impostando Servlet Cookie prevede tre passaggi:

(1) Creare un oggetto Cookie: È possibile chiamare il costruttore del biscotto con un nome di cookie e valore del cookie, nome del cookie e biscotti valori sono stringhe.

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

Ricordate, indipendentemente dal nome o il valore, non deve contenere spazi oi seguenti caratteri:

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

(2) impostare la durata massima: È possibile utilizzare il metodo per specificare SetMaxAge biscotto in grado di mantenere un tempo valido (in secondi).Noi impostare una validità massima di 24 ore un cookie.

cookie.setMaxAge(60*60*24); 

(3) per inviare Cookie header di risposta HTTP: è possibile utilizzare per aggiungere response.addCookierisposta HTTP Cookie, come segue:

response.addCookie(cookie);

Esempi

Andiamo a modificare le nostre istanze dei dati modulo , impostare il cookie di nomi e cognomi.

package com.w3big.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;

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// 为名字和姓氏创建 Cookie      
		Cookie name = new Cookie("name",
				URLEncoder.encode(request.getParameter("name"), "UTF-8")); // 中文转码
		Cookie url = new Cookie("url",
		              request.getParameter("url"));
		
		// 为两个 Cookie 设置过期日期为 24 小时后
		name.setMaxAge(60*60*24); 
		url.setMaxAge(60*60*24); 
		
		// 在响应头中添加两个 Cookie
		response.addCookie( name );
		response.addCookie( url );
		
		// 设置响应内容类型
		response.setContentType("text/html;charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		String title = "设置 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>\n" +
		        "<ul>\n" +
		        "  <li><b>站点名:</b>:"
		        + request.getParameter("name") + "\n</li>" +
		        "  <li><b>站点 URL:</b>:"
		        + request.getParameter("url") + "\n</li>" +
		        "</ul>\n" +
		        "</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);
	}

}

Compilare il precedente HelloFormServlet, e creare la voce appropriata nel file web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- 类名 -->  
    <servlet-name>HelloForm</servlet-name>
    <!-- 所在的包 -->
    <servlet-class>com.w3big.test.HelloForm</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloForm</servlet-name>
    <!-- 访问的网址 -->
    <url-pattern>/TomcatTest/HelloForm</url-pattern>
  </servlet-mapping>
</web-app>
L'ultimo tentativo di chiamare la seguente pagina HTML Servlet.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action=/TomcatTest/HelloForm method="GET">
站点名 :<input type="text" name="name">
<br />
站点 URL:<input type="text" name="url" /><br>
<input type="submit" value="提交" />
</form>
</body>
</html>

Salvare il file di contenuto HTML sopra /TomcatTest/test.html in.

Successivo visitiamo http: // localhost: 8080 / TomcatTest / test.html, Gif demo come segue:

Nota: Alcune delle il percorso precedente richiede più percorso effettivo modificare il progetto.

Leggere Servlet Cookie

Per leggere cookie, è necessario creare un oggettojavax.servlet.http.CookiechiamandoigetCookiesHttpServletRequest() metodo array. Poi scorrere l'array e usa getName () e il metodo getValue () per accedere al valore di ogni biscotto e associata.

Esempi

Cookie Leggiamo l'esempio di cui sopra

package com.w3big.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;

/**
 * Servlet implementation class ReadCookies
 */
@WebServlet("/ReadCookies")
public class ReadCookies extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ReadCookies() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
    	Cookie cookie = null;
    	Cookie[] cookies = null;
    	// 获取与该域相关的 Cookie 的数组
    	cookies = request.getCookies();
         
         // 设置响应内容类型
         response.setContentType("text/html;charset=UTF-8");
    
         PrintWriter out = response.getWriter();
         String title = "Delete Cookie Example";
         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>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:" + 
                                 cookie.getName( ) + "<br/>");
               }
               out.print("名称:" + cookie.getName( ) + ",");
               out.print("值:" +  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);
	}

}

Compilare i precedenti ReadCookiesServlet, e creare la voce appropriata nel file web.xml.Provare a eseguirehttp: // localhost: 8080 / TomcatTest/ HelloForm, mostrerà i seguenti risultati:


Rimuovere Cookie da Servlet

Rimuovere Cookie è molto semplice. Se si desidera eliminare un cookie, è sufficiente seguire le seguenti tre fasi:

  • Legge un cookie esistente, e conservarla in un oggetto Cookie.
  • Utilizzare il metodoSetMaxAge () per impostare del cookie a zero età per eliminare un cookie esistente.
  • Aggiungere il cookie alle intestazioni di risposta.

Esempi

L'esempio seguente cancellerà il cookie esistente denominato "url", la prossima volta che si esegue il ReadCookies Servlet, si tornerà url è nullo.

package com.w3big.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 Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
    	Cookie cookie = null;
  	  Cookie[] cookies = null;
        // 获取与该域相关的 Cookie 的数组
        cookies = request.getCookies();
        
  	  	// 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
   
        PrintWriter out = response.getWriter();
        String title = "删除 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>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:" + 
                                cookie.getName( ) + "<br/>");
              }
              out.print("名称:" + 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);
	}

}

Compilare i precedenti DeleteCookiesServlet, e creare la voce appropriata nel file web.xml.Ora eseguirehttp: // localhost: 8080 / TomcatTest/ DeleteCookies, mostrerà i seguenti risultati: