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

JSP Cookie処理

cookieはクライアントマシンに保存されるテキストファイルで、多くのトラッキング情報を保存しています。Servlet技術の上に立って、JSPは明らかにHTTPcookieのサポートを提供できます。

通常、顧客を識別するためには3つのステップが必要です:

  •             サーバースクリプトは、名前、年齢、ID番号など、一連のcookieをブラウザに送信します。

  •             ブラウザはこれらの情報をローカルマシンに保存し、必要に応じて使用します。

  •             次回、ブラウザがサーバーにリクエストを送信するたびに、これらのcookie情報も同時にサーバーに送信され、サーバーはこれらの情報を使用してユーザーを識別したり他の処理を行います。

本節では、cookie の設定やリセット方法、アクセス方法、削除方法について説明します。

JSP Cookie 処理において、中国語のエンコードとデコードが必要です。以下の方法で行います:

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

Cookie 剖析

cookieは通常HTTPヘッダーで設定されます(JavaScriptがブラウザで直接cookieを設定できる場合もあります)。JSPでは、cookieを設定するためにサーバーに以下のようなヘッダー情報を送信する必要があります:

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2015 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=w3codebox; expires=Friday, 04-Feb-17 22:03:38 GMT; 
                 path=/; domain=oldtoolbag.com
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

JSPスクリプトはrequestオブジェクトのgetCookies()メソッドを通じてこれらのcookieにアクセスし、このメソッドはCookieオブジェクトの配列を返します。

    Servlet Cookie メソッド

以下にCookieオブジェクトでよく使用されるメソッドの一覧を示します:

番号メソッド & 説明
                1public void setDomain(String pattern) cookieのドメインを設定します、例えばoldtoolbag.com
                2public String getDomain() cookieのドメインを取得します、例えばoldtoolbag.com
                3public void setMaxAge(int expiry) 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とそのサブディレクトリが含まれます。
                9public String getPath() cookieのパスを取得します。
                10public void setSecure(boolean flag) cookieが暗号化されたトランスポートを必要とするかどうかを示します。
                11public void setComment(String purpose) cookieの目的を説明するコメントを設定します。ブラウザが cookie をユーザーに表示する際に、コメントは非常に有用になります。
                12public String getComment() cookieの目的を説明するコメントを返します。コメントがない場合は null を返します。

JSPを使用してcookieを設定する

JSPを使用してcookieを設定する手順は以下の3ステップです:

(1) cookie オブジェクトの作成: cookie の構造関数を呼び出して、cookie 名と値を引数として使用します。これらはすべて文字列です。

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

名前と値には必ずしもスペースや以下の文字を含めないでください:

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

(2) 有効期限の設定:setMaxAge() 函数を呼び出して cookie がどれくらいの時間(秒単位)有効であることを示します。以下の操作では有効期限を設定しました: 24 時間。

cookie.setMaxAge(60*60*24);

(3cookie を HTTP レスポンスヘッダーに送信します:response.addCookie() 函数を呼び出して HTTP レスポンスヘッダーに cookie を追加します。

response.addCookie(cookie);

例示

main.jsp ファイルのコードは以下の通りです:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net."*" %>
<%
   // エンコード、中文の乱码を解決   
   String str = URLEncoder.encode(request.getParameter("name"),"utf-8);  
   // nameとurl cookieを設定 
   Cookie name = new Cookie("name",
           str);
   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);
%>
<html>
<head>
<title>Cookieを設定</title>
</head>
<body>
<h1>Cookieを設定</h1>
<ul>
<li><p><b>ウェブサイト名:</b>
   <%= request.getParameter("name") %>
</p></li>
<li><p><b>URL:</b>
   <%= request.getParameter("url") %>
</p></li>
</ul>
</body>
</html>

以下は、GETメソッドを使用してクライアントデータをmain.jspファイルに送信し、cookieを設定する簡単なHTMLフォームです:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>基本チュートリアルウェブ(oldtoolbag.com)</title>
</head>
<body>
<form action="main.jsp" method=GET>
サイト名: <input type="text" name="name">
<br />
URL: <input type="text" name="url" />
<input type="submit" value="送信" />
</form>
</body>
</html>

上記のHTMLコードを test.htm ファイルに保存します。

このファイルを現在のjspプロジェクトのWebContentディレクトリに配置します(main.jspと同じディレクトリ)。

http: にアクセスして、//localhost:8080/testjsp/test.html ファイルが以下のように main.jsp ファイルにフォームデータを送信します:

「サイト名」および「URL」を入力し、送信ボタンをクリックすると、画面に「サイト名」および「URL」が表示され、「サイト名」および「URL」の2つのcookieが設定されます。

JSPを使用してCookieを読み取る

cookieを読み取るには、request.getCookies()メソッドを呼び出してjavax.servlet.http.Cookieオブジェクトの配列を取得し、その配列を巡回してgetName()メソッドとgetValue()メソッドを使用して各cookieの名前と値を取得する必要があります。

例示

前の例で使用したcookieを読み取ります。以下はcookie.jspファイルのコードです:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net."*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Cookieを取得</title>
</head>
<body>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // cookiesのデータを取得します。これは配列です。
   cookies = request.getCookies();
   if( cookies != null ){
      out.println("<h2> 検索 Cookie 名と値</h2);
      for (int i = 0; i < cookies.length; i++{
         cookie = cookies[i];
        
         out.print("パラメータ名 : " + cookie.getName());
         out.print("<br>
         out.print("パラメータ値: " + URLDecoder.decode(cookie.getValue(), "utf-8) +" <br>"
         out.print("------------------------------------<br>
      }
  }
      out.println("<h2没有发现 Cookie</h2);
  }
%>
</body>
</html>

ブラウザでアクセス後、出力結果は以下の通りです:

    JSPを使用してcookieを削除

cookieを削除するのは非常に簡単です。cookieを削除する場合は、以下の手順に従ってください:

  •             既存のcookieを取得し、Cookieオブジェクトに保存します。

  •             cookieの有効期限を0に設定します。

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

例示

以下のプログラムは、名前が "name" のcookieを削除します。cookie.jspを2度目に実行すると、nameがnullになります。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net."*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Cookieを取得</title>
</head>
<body>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // 現在のドメイン下のcookiesを取得します。これは配列です。
   cookies = request.getCookies();
   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("<br>
         out.print("パラメータ値: " + URLDecoder.decode(cookie.getValue(), "utf-8) +" <br>"
         out.print("------------------------------------<br>
      }
  }
      out.println("<h2没有发现 Cookie</h2);
  }
%>
</body>
</html>

ブラウザでアクセスすると、以下のような出力が得られます:

http: に再度アクセスします://localhost:8080/testjsp/cookie.jsp、以下のような結果が得られます:

名前が「name」のcookieが消えたことが確認できます。

ブラウザで手動でcookieを削除することもできます。IEブラウザでは、ツールメニューをクリックして、インターネットオプションを選択し、cookieを削除するをクリックすると、すべてのcookieが削除されます。