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

Servlet クッキー処理

Cookieはクライアント側のコンピュータに保存されているテキストファイルであり、さまざまなトレーキング情報を保持しています。Java ServletはHTTP Cookieを明らかにサポートしています。

ユーザーを識別するためにCookieを使用する方法は、以下の3つのステップで構成されています:

  • サーバースクリプトはブラウザにCookieのセットを送信します。例えば、名前、年齢、または識別番号などです。

  • ブラウザはこれらの情報をローカルコンピュータに保存し、将来の使用のために利用します。

  • 次にブラウザがWebサーバーに任意のリクエストを送信した場合、ブラウザはこれらのCookie情報をサーバーに送信し、サーバーはこれらの情報を使用してユーザーを識別します。

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

Servlet Cookie処理では、中国語をエンコードおよびデコードする必要があります。方法は以下の通りです:

String str = java.net.URLEncoder.encode("中文","UTF"-8");            //エンコード
String str = java.net.URLDecoder.decode("エンコードされた文字列","UTF-8");   // デコード

Cookie解析

Cookieは通常HTTPヘッダー情報に設定されます(JavaScriptでもブラウザ上で直接Cookieを設定できます)。Cookieを設定するServletは以下のようなヘッダー情報を送信します:

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

ご覧の通り、Set-Cookieヘッダーには、名前と値のペア、GMT日付、パス、ドメインが含まれています。名前と値はURLエンコードされます。expiresフィールドは、ブラウザに指定された時間と日付以降にこのCookieを「忘れる」ように指示する命令です。

ブラウザがCookieを保存するように設定されている場合、情報は到期日まで保持されます。ユーザーのブラウザが該当するCookieのパスとドメインを持つページにリダイレクトすると、Cookieがサーバーに再送信されます。ブラウザのヘッダー情報は以下のようになります:

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はリクエストメソッドを通じて request.getCookies() Cookieにアクセスします。このメソッドは、以下を返します Cookie オブジェクトの配列。

Servlet Cookie メソッド

以下はServletでCookieを操作する際に使用できる便利なメソッドリストです。

番号方法 & 説明
1public void setDomain(String pattern)
このメソッドは、cookie が適用されるドメインを設定します。例えば、oldtoolbag.com。
2public String getDomain()
このメソッドは、cookie が適用されるドメインを取得します。例えば、oldtoolbag.com。
3public void setMaxAge(int expiry)
このメソッドは、cookie の有効期限を設定します(秒単位で)。このように設定しない場合、cookie は現在のセッション会話中にのみ有効です。
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 を返します。

Servlet を通じて Cookie を設定

Servlet を通じて Cookie を設定するには、3つのステップがあります:

(1) Cookie オブジェクトを作成します:cookie 名称と cookie 値を持つ Cookie 構造関数を呼び出すことができます。cookie 名称と cookie 値はすべて文字列です。

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

名前や値には、スペースや以下の文字が含まれてはなりません:

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

(2) 最長生存期間を設定します:setMaxAgeメソッドを使用して、cookieが有効になる時間(秒単位)を指定できます。以下に、最長有効期限を設定します: 24 時間のcookie。

cookie.setMaxAge(60*60*24);

(3) CookieをHTTP応答ヘッダーに送信します:以下のように、CookieをHTTP応答ヘッダーに送信するために使用できます: response.addCookie を変更して、HTTP応答ヘッダーにCookieを追加します:

response.addCookie(cookie);

オンラインサンプル

私たちの フォームデータ例、名前と姓の Cookieを設定します。

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;
/**
 * Servlet 実装クラス HelloServlet
 */
@WebServlet("/HelloForm)
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Auto-生成されたコンストラクタスタブ
    }
    /**
     * @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");-8")); // 中国語変換
        Cookie url = new Cookie("url",
                      request.getParameter("url"));
        
        // 2つの Cookieの有効期限を設定します 24 時間後
        name.setMaxAge(60*60*24); 
        url.setMaxAge(60*60*24); 
        
        // 応答ヘッダーに2つの 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-生成されたメソッドスケルトン
        doGet(request, response);
    }
}

上記の Servlet をコンパイルします HelloForm、web.xml ファイルに適切なエントリを作成します:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- クラス名 -->  
    <servlet-name>HelloForm</servlet-name>
    <!-- のパッケージ -->
    <servlet-class>com.w3codebox.test.HelloForm</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloForm</servlet-name>
    <!-- 訪問するウェブサイト -->
    <url-pattern>/TomcatTest/HelloForm</url-pattern>
  </servlet-mapping>
</web-app>

最後に以下の HTML ページを試して Servlet を呼び出します。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>基礎教程網(w3(codebox.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>

上記の HTML 内容をファイルに保存します /TomcatTest/test.html 内にアクセスします。

次に、http://localhost:8080/TomcatTest/test.html、以下のように表示されます:

「提交」ポイントをクリックした後、以下のようになります:

注意:上記の一部のパスは、プロジェクトの実際のパスに応じて修正する必要があります。

Servlet で Cookie を読み取る

Cookie を読み取るために、呼び出す必要があります HttpServletRequestgetCookies( ) メソッドは javax.servlet.http.Cookie オブジェクトの配列です。それから配列をループして、getName() と getValue() メソッドを使って各 cookie と関連する値にアクセスします。

オンラインサンプル

上記の例で設定された Cookie を読み取ろう

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;
/**
 * Servlet 実装クラス ReadCookies
 */
@WebServlet("/ReadCookies)
public class ReadCookies extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ReadCookies() {
        super();
        // TODO Auto-生成されたコンストラクタスタブ
    }
    /**
     * @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-生成されたメソッドスケルトン
        doGet(request, response);
    }
}

上記の Servlet をコンパイルします ReadCookiesをweb.xmlファイルに適切なエントリを作成し、実行を試みます。 http://localhost:8080/TomcatTest/ReadCookies、以下の結果が表示されます:


Servletを使用してCookieを削除します

Cookieの削除は非常に簡単です。cookieを削除したい場合は、以下の3つのステップに従ってください:

  • 現在のcookieを読み取り、Cookieオブジェクトに保存します。

  • 使用 setMaxAge() cookieの有効期限を0に設定して、現在のcookieを削除します。

  • このcookieをレスポンスヘッダーに追加します。

オンラインサンプル

以下の例では、次回 ReadCookies Servletを実行したときにurlがnullになるように、現在の「url」名のcookieを削除します。

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 Auto-生成されたコンストラクタスタブ
    }
    /**
     * @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-生成されたメソッドスケルトン
        doGet(request, response);
    }
}

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