Cookieを使ったデータの保存

 Cookieとは、Webクライアントのコンピューターに情報を保存させておく仕組みのことです。クライアントサーバ形式のアプリケーションでは技術的にはサーバーからクライアントを操作することはできます。しかし、それによってセキュリティ上の問題が発生します。状況によってはハードディスクの中身を全部消去されかねません。そこで、クライアント側のリソースをサーバー側で操作できないようになっています。

 しかし、どうしてもクライアント側にデータを保存しないと不便な場合があります。そこで、少量のデータをハードディスク内に保存する仕組みが用意されています。それがCookieです。Cookieはデータを保存する目的以外にも、セッションを管理したり、ログイン状態を保持したりするときにも使用されます。

 CookieはHttpCookieのオブジェクトで利用できます。。HttpRequestオブジェクトのCookiesプロパティ、HttpResponseオブジェクトのCookiesプロパティで扱うことができます。

■ 主なプロパティ

プロパティ名 概要
Domain Cookieを関連付けるドメインを取得・設定する
Expires Cookieの有効期限の日時を取得・設定する
Item[文字列] Valueプロパティへのショートカットを取得する
Name Cookieの名前を取得・設定する
Value 各Cookieの値を取得・設定する
Value 1つのCookie内に格納されているキー・値のペアのコレクションを取得する
HttpCookieの主なプロパティ

 CookieはWebブラウザーのメモリに保存しておく方法と、ハードディスクに保存する方法があります。それぞれの方法を見てみましょう。

■ Webブラウザーのメモリに保存する

 まず、メモリ上にCookieを保存する方法を見てみましょう。この方法はWebブラウザーを閉じると保存しているデータは消えてしまいます。

プロジェクトの種類 ASP.NET Webアプリケーション
プロジェクト名 CookieTest

サンプルダウンロード

○ デザイン(index.aspx)

 Webフォーム(index.aspx)を追加して、次のようにコントロールを配置してください。

コントロールの配置例
コントロールの配置例

○ プログラム(index.aspx.cs)

 次のようにプログラムを記述してください。

index.aspx.cs

  1. protected void btnSend_Click(object sender, EventArgs e)
  2. {
  3.  //Cookieにデータを保存
  4.  this.Response.Cookies["Email"].Value = this.txtEmail.Text;
  5.  //遷移
  6.  this.Response.Redirect("receive.aspx");
  7. }

○ デザイン(receive.aspx)

 Webフォーム(receive.aspx)を追加して、次のようにコントロールを配置してください。

コントロールの配置例
コントロールの配置例

○ プログラム(receive.aspx.cs)

 次のようにプログラムを記述してください。

receive.aspx.cs

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3.  //Cookieの文字列を取得
  4.  HttpCookie email = this.Request.Cookies["Email"];
  5.  //クッキーの内容を表示
  6.  if (email != null)
  7.  {
  8.   this.lblEmail.Text = email.Value;
  9.  }
  10.  else
  11.  {
  12.   this.lblEmail.Text = "クッキーが存在しません。";
  13.  }
  14. }

○ 実行結果

実行結果
実行結果

○ 解説

 index.aspx.csの20行目でCookieを保存しています。Cookieの保存はWebブラウザーに行うので、HttpResponseオブジェクトにCookieをセットします。今回はEmailというキーでCookieを保存しています。

 receive.aspx.csの15行目では、Cookieを取得しています。Webサーバーから見ると、Webブラウザーが送ってきたデータの中にWebブラウザーが持っていたCookieがあるので、HttpRequestオブジェクトを参照します。今回は、Cookieを取得してemail変数に格納しています。18行目では、Cookieが存在しない場合はemail変数にはnullがセットされるので、エラーメッセージを表示しています。20行目でHttpCookieオブジェクトのValueプロパティを参照して、保存してあったメールアドレスを取り出してlblEmailに表示しています。

■ Webクライアントのローカルディスクに保存する

 次にCookieをWebクライアントのローカルディスクに保存をする方法を見てみましょう。この方法は、Webブラウザーを閉じても、Webクライアントの電源を落としても情報は保持されます。そのためには、有効期限を設定します。

○ プロジェクト

 プロジェクトを作成して確認してみましょう。

プロジェクトの種類 ASP.NET Webアプリケーション
プロジェクト名 CookieTest2

サンプルダウンロード

○ デザイン

 Webフォームを追加して、次のようにコントロールを配置してください。

コントロールの配置例
コントロールの配置例

○ プログラム

 次のようにプログラムを記述してください。

index.aspx.cs

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3.  //ポストバックのときは処理をしない
  4.  if (this.IsPostBack)
  5.  {
  6.   return;
  7.  }
  8.  //Cookieが存在するかどうか
  9.  if(this.Request.Cookies["UserInfo"] != null)
  10.  {
  11.   //Cookieからデータを取り出す
  12.   System.Collections.Specialized.NameValueCollection userinfo;
  13.   userinfo = this.Request.Cookies["UserInfo"].Values;
  14.   //取り出したCookieの情報を表示
  15.   this.txtUserName.Text = this.Server.HtmlEncode(userinfo["UserID"]);
  16.   this.txtName.Text = this.Server.HtmlEncode(userinfo["UserName"]);
  17.   this.txtEmail.Text = this.Server.HtmlEncode(userinfo["EmailAddress"]);
  18.  }
  19.  else
  20.  {
  21.   //各TextBoxをクリア
  22.   this.txtUserName.Text = string.Empty;
  23.   this.txtName.Text = string.Empty;
  24.   this.txtEmail.Text = string.Empty;
  25.  }
  26. }
  27. protected void btnSend_Click(object sender, EventArgs e)
  28. {
  29.  //Cookieオブジェクトを生成
  30.  HttpCookie cook = new HttpCookie("UserInfo");
  31.  //保存が選択されているかどうか
  32.  if (this.chkSave.Checked)
  33.  {
  34.   //Cookieにデータを保存する
  35.   cook.Values["UserID"] = this.txtUserName.Text;
  36.   cook.Values["UserName"] = this.txtName.Text;
  37.   cook.Values["EmailAddress"] = this.txtEmail.Text;
  38.   //Cookieに有効期限を設定する
  39.   cook.Expires = DateTime.Now.AddDays(1);
  40.  }
  41.  else
  42.  {
  43.   //Cookieを削除する
  44.   cook.Expires = DateTime.Now.AddDays(-1);
  45.  }
  46.  //CookieをWebクライアントに送る準備をする
  47.  this.Response.Cookies.Add(cook);
  48.  //各TextBoxをクリア
  49.  this.txtUserName.Text = string.Empty;
  50.  this.txtName.Text = string.Empty;
  51.  this.txtEmail.Text = string.Empty;
  52. }

○ 実行結果

実行結果
実行結果

○ 解説

 24行目では、System.Collections.Specialized.NameValueCollection型の変数userinfoを用意しています。このデータ型は、HttpCookieオブジェクトのValuesプロパティの型です。今回は、HttpCookieのValuesプロパティに複数のデータを設定してあるので、そのデータを取り出すために用意しました。Valuesプロパティの値はキー・値のペアで扱います。28~30行目で、それぞれのCookieのデータをTextBoxに表示しています。

 44行目ではHttpCookieオブジェクトを、名前を指定して生成しています。50~52行目では、CheckBoxにチェックが入っていた場合にHttpCookieオブジェクトのValuesプロパティにキーと値を指定して格納しています。55行目では、HttpCookieオブジェクトのExpiresプロパティに明日の日付をセットしています。このように保管期限を指定することでCookieはWebクライアントのローカルディスクに保存され、Webブラウザーを閉じても使用できるようになります。Cookieを削除する場合は55行目にあるように期限切れにした状態でWebブラウザーにレスポンスを送ると削除されます。

 今回のサンプルは、情報を保存するにチェックを入れて送信ボタンを押した後で、Webブラウザーを閉じて再び同じURLにアクセスしてみましょう。先回入力した内容がTextBoxに表示されます。

前へ   次へ