サーブレット Cookie の処理


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

再訪ユーザーの識別には 3 つの手順が必要です:

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

  • ブラウザは、将来の使用に備えてこの情報をコンピュータ上にローカルに保存します。

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

この章では、Cookie の設定またはリセット方法、Cookie へのアクセス方法、削除方法について説明します。

Cookie の構造

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

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 エンコードされます。有効期限フィールドは、指定された日時に 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

サーブレットは、リクエスト メソッド request.getCookies() を通じて Cookie にアクセスでき、これは Cookie オブジェクトの配列を返します。

サーブレット Cookie メソッド

以下は、サーブレットで Cookie を操作するときに使用できる便利なメソッドのリストです。

シリアル番号メソッドと説明
1public void setDomain(String pattern)
このメソッドは、w3cschool.cc など、Cookie が適用されるドメインを設定します。
2public String getDomain()
このメソッドは、Cookie が適用されるドメイン (w3cschool.cc など) を取得します。
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 purposes)
このメソッドは、Cookie の目的を説明するコメントを指定します。この注釈は、ブラウザがユーザーに Cookie を提示するときに役立ちます。
12public String getComment()
このメソッドは、Cookie の目的を説明するコメントを返します。Cookie にコメントがない場合は null を返します。

サーブレットを介して Cookie を設定する

サーブレットを介して 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) HTTP 応答ヘッダーに Cookie を送信します: 以下に示すように、response.addCookie を使用して HTTP 応答ヘッダーに Cookie を追加できます:

response.addCookie(cookie);

フォーム データ インスタンスを変更して、Cookie を設定しましょう名と姓の場合。

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// 扩展 HttpServlet 类
public class HelloForm extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 为名字和姓氏创建 Cookies      
      Cookie firstName = new Cookie("first_name",
                      request.getParameter("first_name"));
      Cookie lastName = new Cookie("last_name",
                      request.getParameter("last_name"));

      // 为两个 Cookies 设置过期日期为 24 小时后
      firstName.setMaxAge(60*60*24); 
      lastName.setMaxAge(60*60*24); 

      // 在响应头中添加两个 Cookies
      response.addCookie( firstName );
      response.addCookie( lastName );

      // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");
 
      PrintWriter out = response.getWriter();
      String title = "设置 Cookies 实例";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\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("first_name") + "\n</li>" +
                "  <li><b>姓氏</b>:"
                + request.getParameter("last_name") + "\n</li>" +
                "</ul>\n" +
                "</body></html>");
  }
}

上記のサーブレット HelloForm をコンパイルし、web.xml ファイルに適切なエントリを作成し、最後に次の HTML ページを試してサーブレットを呼び出します。

 <html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>
<form action="HelloForm" method="GET">
名字:<input type="text" name="first_name">
<br />
姓氏:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>
</body>
</html>

上記の HTML コンテンツをファイル hello.htm に保存し、<Tomcat-installation-directory>/webapps/ROOT ディレクトリに配置します。 http://localhost:8080/Hello.htm にアクセスすると、上記のフォームの実際の出力は次のようになります:

姓と名を入力して、[送信] ボタンをクリックしてください。名前と姓が表示されます。 画面上には、firstName と lastName の 2 つの Cookie が同時に設定され、次回送信ボタンを押すと、これら 2 つの Cookie がサーバーに送信されます。

次のセクションでは、Web アプリケーションでこれらの Cookie にアクセスする方法について説明します。

サーブレット経由の Cookie の読み取り

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

上記のインスタンスに設定された Cookie を読み取ってみましょう

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// 扩展 HttpServlet 类
public class ReadCookies extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      Cookie cookie = null;
	  Cookie[] cookies = null;
      // 获取与该域相关的 Cookies 的数组
      cookies = request.getCookies();
      
      // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");
 
      PrintWriter out = response.getWriter();
      String title = "Reading Cookies Example";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" );
      if( cookies != null ){
         out.println("<h2>查找 Cookies 名称和值</h2>");
         for (int i = 0; i < cookies.length; i++){
            cookie = cookies[i];
            out.print("名称:" + cookie.getName( ) + ",");
            out.print("值:" + cookie.getValue( )+" <br/>");
         }
      }else{
          out.println("<h2>未找到 Cookies</h2>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

上記のサーブレット ReadCookies をコンパイルし、web.xml ファイルに適切なエントリを作成します。 first_name Cookie を「John」に設定し、last_name Cookie を「Player」に設定した場合、http://localhost:8080/ReadCookies を実行してみると、次の結果が表示されます:

Find Cookies名前と値

名前: first_name、値: John
名前: last_name、値: Player

サーブレット経由で Cookie を削除する

Cookie を削除するのは非常に簡単です。 Cookie を削除したい場合は、次の 3 つの手順に従うだけです:

  • 既存の Cookie を読み取り、それを Cookie オブジェクトに保存します。

  • setMaxAge()メソッドを使用してCookieの経過時間を0に設定し、既存のCookieを削除します。

  • この Cookie を応答ヘッダーに追加します。

次の例では、「first_name」という名前の既存の Cookie を削除し、次回 ReadCookies サーブレットを実行するときに、first_name を null 値として返します。

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// 扩展 HttpServlet 类
public class DeleteCookies extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      Cookie cookie = null;
	  Cookie[] cookies = null;
      // 获取与该域相关的 Cookies 的数组
      cookies = request.getCookies();
      
	  // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");
 
      PrintWriter out = response.getWriter();
      String title = "Delete Cookies Example";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" );
       if( cookies != null ){
         out.println("<h2>Cookies 名称和值</h2>");
         for (int i = 0; i < cookies.length; i++){
            cookie = cookies[i];
            if((cookie.getName( )).compareTo("first_name") == 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 cookies founds</h2>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

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

Cookie の名前と値

削除された Cookie: first_name
Name: first_name、value: John
Name: last_name、value :Player

次に http://localhost:8080/ReadCookies を実行してみます。すると、次のような Cookie が 1 つだけ表示されます:

Cookie の名前と値を検索

Name: last_name, value : Player

Internet Explorer では Cookie を手動で削除できます。 「ツール」メニューで「インターネット オプション」を選択します。すべてのCookieを削除したい場合は、「Cookieを削除」をクリックしてください。