Latest web development tutorials

Servlet Cookie Processing

Cookie est un fichier texte stocké sur l'ordinateur client, et conserve un certain nombre d'informations de suivi. Java Servlet supporte clairement Cookie HTTP.

Renvoie l'identification de l'utilisateur comprend trois étapes:

  • script serveur envoie un cookie au navigateur. Par exemple: le nom, l'âge ou le numéro d'identification.
  • Le navigateur va stocker ces informations sur l'ordinateur local pour une utilisation future.
  • La prochaine fois que le navigateur envoie une requête à un serveur Web, le navigateur envoie les informations Cookie sur le serveur, le serveur utilisera ces informations pour identifier les utilisateurs.

Ce chapitre vous explique comment définir ou redéfinir Cookie, comment y accéder, et comment les supprimer.

Servlet Cookie besoins de traitement de l'encodage chinois et décoder, comme suit:

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

Analyse de Cookie

Cookie est généralement défini dans les informations d'en-tête HTTP (bien que JavaScript peut également être réglé directement dans un navigateur Cookie). Réglage de la Cookie Servlet enverra l'en-tête suivant:

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

Comme vous pouvez le voir, en-tête Set-Cookie contient une paire de valeur de nom, une date de GMT, un chemin d'accès et un domaine. Le nom et la valeur seront URL codées. expire champ est une instruction qui indique au navigateur après une date et une heure donnée à «oublier» le cookie.

Si votre navigateur est configuré pour stocker des cookies, il conservera cette information jusqu'à la date d'expiration. Si le navigateur de l'utilisateur pour correspondre à une quelconque du domaine Cookie et le chemin de la page, il sera ré-envoyer le cookie au serveur. informations d'en-tête du navigateur peut apparaître comme suit:

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 peut accéder par Cookie méthode de demanderequest.getCookies (),qui retourne un tableau d'objetsCookie.

Servlet Méthodes Cookie

Ce qui suit est une liste de méthodes utiles lors de l'utilisation dans un Cookie Servlet peut être utilisé.

序号方法 & 描述
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。

Paramètres des cookies par Servlet

En réglant Servlet Cookie comporte trois étapes:

(1) Créer un objet Cookie: Vous pouvez appeler le constructeur Cookie avec un nom de cookie et valeur du cookie, le nom de cookie et biscuits valeurs sont des chaînes.

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

Rappelez-vous, quel que soit le nom ou la valeur, ne doit pas contenir d'espaces ou les caractères suivants:

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

(2) définir la durée de vie maximale:Vous pouvez utiliser la méthode pour spécifier biscuit setMaxAge capable de maintenir un temps valide (en secondes). Nous allons définir une durée maximale de 24 heures par biscuit.

cookie.setMaxAge(60*60*24); 

(3) pour envoyer des en- têtes de réponse HTTP Cookie:Vous pouvez utiliserresponse.addCookiepour ajouter une réponse HTTP en- tête Cookie, comme suit:

response.addCookie(cookie);

Exemples

Modifions nos instances de données de formulaire , définissez le Cookie de noms et prénoms.

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);
	}

}

Compiler leServlet HelloForm précédent, et de créer l'entrée appropriée dans le fichier 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>
La dernière tentative d'appeler la page HTML suivante 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>

Enregistrez le fichier au contenu HTML ci-dessus /TomcatTest/test.html dans.

Ensuite, nous visitons http: // localhost: 8080 / TomcatTest / test.html, Gif démo comme suit:

Note: Une partie de la voie ci - dessus nécessite plus trajectoire réelle modifier votre projet.

Lisez Servlet Cookie

Pour lire Cookie, vous devez créer un objetjavax.servlet.http.Cookieen appelantlesgetCookiesde HttpServletRequest(méthode) tableau. Ensuite, la boucle à travers le réseau et utilise getName () et la méthode getValue () pour accéder à la valeur de chaque biscuit et associé.

Exemples

Cookie Lisons l'exemple ci-dessus ensemble

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);
	}

}

Compiler les ReadCookiesServlet précédents, et de créer l'entrée appropriée dans le fichier web.xml.Essayez d'exécuterhttp: // localhost: 8080 / TomcatTest/ HelloForm, montrera les résultats suivants:


Supprimer le cookie par Servlet

Supprimer le cookie est très simple. Si vous voulez supprimer un cookie, il vous suffit de suivre les trois étapes suivantes:

  • Lit un biscuit existant, et le stocker dans un objet Cookie.
  • Utiliser la méthodesetMaxAge () pour définir le cookie de zéro l'âge de supprimer un biscuit existant.
  • Ajouter le cookie à les en-têtes de réponse.

Exemples

L'exemple suivant supprime le cookie existant nommé "url", la prochaine fois que vous exécutez les ReadCookies Servlet, il sera de retour url est nulle.

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);
	}

}

Compiler les DeleteCookiesServlet précédents, et de créer l'entrée appropriée dans le fichier web.xml.Maintenant , exécutezhttp: // localhost: 8080 / TomcatTest/ DeleteCookies, montrera les résultats suivants: