Latest web development tutorials

サーブレットクッキー処理

クッキーは、クライアントコンピュータに格納されたテキストファイルで、情報を追跡するさまざまなを保持しています。 Javaサーブレットは、明らかにHTTPクッキーをサポートしています。

ユーザ識別は次の3つの手順が含ま返します:

  • サーバースクリプトは、ブラウザのクッキーを送信します。 たとえば、次のように名前、年齢や識別番号。
  • ブラウザは、将来の使用のために、ローカルコンピュータ上でこの情報を保存します。
  • ブラウザが任意のWebサーバーに要求を送信し、次回は、ブラウザがサーバーがユーザーを識別するためにこの情報を使用しますが、サーバーにCookie情報を送信します。

この章では、セットまたはリセットクッキーを、それらにアクセスする方法、およびそれらを削除する方法する方法を説明します。

中国のエンコードとデコードのニーズを処理するサーブレットクッキー、次のように

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

クッキー分析

(JavaScriptは、ブラウザのCookieに直接設定することができますが)クッキーは、通常のHTTPヘッダ情報に設定されています。 サーブレットクッキーを設定すると、次のヘッダーが送信されます。

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

あなたが見ることができるように、Set-Cookieヘッダーは、名前と値のペア、GMT日付、パスとドメインが含まれています。 名前と値は、URLエンコードされます。 フィールドがクッキーを「忘れる」に指定された日付と時刻の後にブラウザに指示命令で期限切れになります。

ブラウザは、クッキーを格納するように構成されている場合は、有効期限までの情報を保持します。 ユーザーのブラウザがクッキーのドメインとページのパスのいずれかに一致する場合は、サーバーにクッキーを再送信します。 次のようにブラウザのヘッダ情報が表示されることがあります。

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

サーブレットは、クッキーオブジェクトの配列を返しますクッキー要求メソッドrequest.getCookies()によってアクセスすることができます。

サーブレットクッキーメソッド

以下は、サーブレットクッキーで動作を使用することができる便利なメソッドの一覧です。

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

サーブレットを通じてCookieの設定

サーブレットクッキーを設定することにより3つのステップを含みます:

(1)クッキーオブジェクトを作成します。あなたはクッキー名とクッキーの値を持つクッキーのコンストラクタを呼び出すことができ、クッキー名とクッキーの値は文字列です。

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

スペースや次の文字を含めることはできませんにかかわらず、名前または値の、覚えておいてください:

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

(2)最大有効期間を設定します。あなたは(秒)有効な時間を維持することができクッキーsetMaxAgeを指定する方法を使用することができます。私たちは24時間Cookieの最長有効期間を設定します。

cookie.setMaxAge(60*60*24); 

(3)クッキーHTTPレスポンスヘッダを送信するために:あなたは、HTTPレスポンスヘッダのクッキーを追加するためにresponse.addCookieを使用することができ、次のように:

response.addCookie(cookie);

私たちの変更してみましょう形式データのインスタンスを姓と名のクッキーを設定し、。

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

}

以前のサーブレット HelloFormをコンパイルし、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>
次のHTMLページのサーブレットを呼び出すための最後の試み。

<!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>

で/TomcatTest/test.html上記のHTMLコンテンツにファイルを保存します。

次に、http:// localhost:8080にアクセス/ TomcatTest / test.htmlという、GIF形式のデモを次のように:

注:上記のパスのうちのいくつかは、あなたのプロジェクトを変更、より実際のパスを必要とします。

サーブレットクッキーを通して読みます

クッキーを読み取るには、HttpServletRequestのgetCookies()メソッドの配列を呼び出すことによってのjavax.servlet.http.Cookieオブジェクトを作成する必要があります。 その後、配列をループし、各クッキーおよび関連の値にアクセスするためのgetName()とのgetValue()メソッドを使用しています。

クッキーはのは、上記の例のセットを読んでみましょう

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

}

以前のサーブレット ReadCookiesをコンパイルし、web.xmlファイルに適切なエントリを作成します。HTTPを実行してみてください:// localhostを:8080 / TomcatTest/ HelloForm、以下の結果が表示されます:


サーブレットによってクッキーを削除します

削除クッキーは非常に簡単です。 あなたはクッキーを削除したい場合は、あなただけの次の3つの手順に従ってくださいする必要があります。

  • 既存のクッキーを読み取り、Cookieオブジェクトに格納します。
  • 既存のCookieを削除するには、クッキーの年齢ゼロを設定するsetMaxAge()メソッドを使用します。
  • レスポンスヘッダにクッキーを追加します。

次の例では、「URL」という名前の既存のCookieを削除します、あなたはサーブレットReadCookiesの次回実行時には、それは、URLがnullを返します。

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

}

以前のサーブレット DeleteCookiesをコンパイルし、web.xmlファイルに適切なエントリを作成します。のhttpを実行します:// localhostを:8080 / TomcatTest / DeleteCookies、以下の結果が表示されます: