Cookieをローカルディスクに保存する

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

○ ファイル

 データを入力するJSPファイルを作成します。プロジェクトに次のようなファイルを追加してください。

ファイル名 CookieTest2.jsp

サンプルダウンロード

○ プログラム

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

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page import="java.net.*" %>
  4. <%
  5. //各変数を用意する
  6. String username = "";
  7. String name = "";
  8. String email = "";
  9. //Cookieを取得する
  10. Cookie cookies[]=request.getCookies();
  11. //Cookieが存在するかどうか
  12. if(cookies!=null){
  13.  for(int i=0;i<cookies.length;i++){
  14.   if(cookies[i].getName().equals("UserName")){
  15.    //クッキーのデータを取得
  16.    username = cookies[i].getValue();
  17.    username = URLDecoder.decode(username, "utf-8");
  18.   }
  19.   if(cookies[i].getName().equals("Name")){
  20.    //クッキーのデータを取得
  21.    name = cookies[i].getValue();
  22.    name = URLDecoder.decode(name, "utf-8");
  23.   }
  24.   if(cookies[i].getName().equals("Email")){
  25.    //クッキーのデータを取得
  26.    email = cookies[i].getValue();
  27.    email = URLDecoder.decode(email, "utf-8");
  28.   }
  29.  }
  30. }
  31. %>
  32. <!DOCTYPE html PUBLIC "-//W3C//DTD Html 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  33. <html>
  34. <head>
  35. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  36. <title>クッキーの保存</title>
  37. </head>
  38. <body>
  39.  <form action="cookietest2" method="POST">
  40.   ユーザー情報をローカルディスクに保存<br>
  41.   <br>
  42.   ユーザー名:<input type="text" name="username" value="<%= username %>"><br>
  43.   <br>
  44.   名前:<input type="text" name="name" value="<%= name %>"><br>
  45.   <br>
  46.   Email:<input type="text" name="email" value="<%= email %>"><br>
  47.   <br>
  48.   <input type="checkbox" name="save" value="save">情報を保存する<br>
  49.   <br>
  50.   <input type="submit" value="送信">
  51.  </form>
  52. </body>
  53. </html>

○ ファイル

 次に入力したデータをCookieに保存するプログラムを作成します。プロジェクトに次のようなServletを追加してください。

パッケージ名 test.servlet
クラス名 CookieTest2
スーパークラス名 javax.servlet.http.HttpServlet

サンプルダウンロード

○ プログラム

 doPostメソッドを追加して、次のようにプログラムを入力してください。

  1. package test.servlet;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.net.URLEncoder;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.Cookie;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. public class CookieTest2 extends HttpServlet {
  11.  @Override
  12.  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13.   //パラメータを取得する
  14.   String username = req.getParameter("username");
  15.   String name = req.getParameter("name");
  16.   String email = req.getParameter("email");
  17.   String save = req.getParameter("save");
  18.   //受信したデータをUTF-8に変換する
  19.   username = new String(username.getBytes("8859_1"), "UTF-8");
  20.   name = new String(name.getBytes("8859_1"), "UTF-8");
  21.   email = new String(email.getBytes("8859_1"), "UTF-8");
  22.   //Cookie仁保損するデータをURLエンコードにかける
  23.   username = URLEncoder.encode(username, "utf-8");
  24.   name = URLEncoder.encode(name, "utf-8");
  25.   email = URLEncoder.encode(email, "utf-8");
  26.   //クッキーを準備する
  27.   Cookie uncookie = new Cookie("UserName", username);
  28.   Cookie ncookie = new Cookie("Name", name);
  29.   Cookie ecookie = new Cookie("Email", email);
  30.   //情報を保存するかどうかで分岐する
  31.   if(save != null && save.equals("save")){
  32.    //クッキーの有効期限を未来にセットする
  33.    uncookie.setMaxAge(60*60*24*30);
  34.    ncookie.setMaxAge(60*60*24*30);
  35.    ecookie.setMaxAge(60*60*24*30);
  36.   }else{
  37.    //クッキーの有効期限を未来にセットする
  38.    uncookie.setMaxAge(-1);
  39.    ncookie.setMaxAge(-1);
  40.    ecookie.setMaxAge(-1);
  41.   }
  42.   //各クッキーを送信する準備をする
  43.   resp.addCookie(uncookie);
  44.   resp.addCookie(ncookie);
  45.   resp.addCookie(ecookie);
  46.   //クライアントに出力する準備
  47.   resp.setContentType("text/html; charset=utf-8");
  48.   PrintWriter pw = resp.getWriter();
  49.   //クライアントにHtmlタグを書き出す
  50.   pw.println("<html>");
  51.   pw.println("<head>");
  52.   pw.println("<title>クッキーに保存</title>");
  53.   pw.println("</head>");
  54.   pw.println("<body>");
  55.   pw.println(" クッキーに保存しました。<br>");
  56.   pw.println(" <a href='CookieTest2.jsp'>もどる</a>");
  57.   pw.println("</body>");
  58.   pw.println("</html>");
  59.  }
  60. }

〇 Webアプリケーション設定ファイルの編集

 web.xmlに次の内容を追加してください。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
  5.   http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  6.   version="3.1">
(そのほかの記述…)
  1.  <servlet>
  2.   <servlet-name>CookieTest2</servlet-name>
  3.   <servlet-class>test.servlet.CookieTest2</servlet-class>
  4.  </servlet>
  5.  <servlet-mapping>
  6.   <servlet-name>CookieTest2</servlet-name>
  7.   <url-pattern>/cookietest2</url-pattern>
  8.  </servlet-mapping>

○ 実行結果

http://localhost:8080/WebApp/CookieTest2.jsp

実行結果
実行結果

○ 解説

 CookieTest2.jspはデータを入力します。このファイルでは、すでにCookieに前回の入力データがあれば、入力フォームに表示させています。11行目でCookieを取得しています。14行目からCookieがあれば、Cookie内のデータを取り出します。16~20行目ではユーザー名のCookieを取り出しています。19行目ではURLDecoderクラスのdecodeメソッド呼び出しています。Cookieを保存するときに日本語を含む情報をURLエンコードしているので、元に戻します。24、29行目も同様です。

 21~25行目では名前を、26~30行目はEmailをCookieから取り出しています。それぞれ取り出したデータを44、46、48行目のフォーム部品のvalue属性に指定しています。これにより前回Cookieに保存した内容が表示されるようになります。

 CookieTest2.jspの送信ボタンがクリックされると、CookieTest2クラスのdoPostメソッドが呼び出されます。このメソッドでは入力したデータをCookieに保存しています。29~31行目では入力したデータをURLエンコードしています。URLEncoderクラスのencodeメソッドを呼び出して変換しています。この処理により日本語の文字列は%XXの形に変換されます。

 Cookieをローカルディスクに保存するにはCookieに有効期限をセットします。41~43行目でそれぞれのCookieオブジェクトにsetMaxAgeメソッドを使って有効期限を約1か月にセットしています。これによりWebブラウザーを閉じてもCookieは残ります。46~48行目はCookieの有効期限を過去にすることでCookieを削除しています。これにより、Webブラウザーを閉じて再びCookieTest2.jspにアクセスすると入力フォームの入力内容は表示されなくなります。

前へ   次へ