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

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

○ ファイル

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

ファイル名 CookieTest2.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(Cookie cookie : cookies){
  14.             if(cookie.getName().equals("UserName")){
  15.                 //クッキーのデータを取得
  16.                 userName = cookie.getValue();
  17.                 userName = URLDecoder.decode(userName, "utf-8");
  18.             }
  19.             if(cookie.getName().equals("Name")){
  20.                 //クッキーのデータを取得
  21.                 name = cookie.getValue();
  22.                 name = URLDecoder.decode(name, "utf-8");
  23.             }
  24.             if(cookie.getName().equals("Email")){
  25.                 //クッキーのデータを取得
  26.                 email = cookie.getValue();
  27.                 email = URLDecoder.decode(email, "utf-8");
  28.             }
  29.         }
  30.     }
  31. %>
  32. <!DOCTYPE html>
  33. <html>
  34. <head>
  35. <meta 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="user_name" 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

サンプルダウンロード

○ プログラム

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

CookieTest2.java

  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.annotation.WebServlet;
  7. import javax.servlet.http.Cookie;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. @WebServlet("/cookietest2")
  12. public class CookieTest2 extends HttpServlet {
  13.     @Override
  14.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  15.         //受信するデータの文字コードを設定する
  16.         req.setCharacterEncoding("utf-8");
  17.                 
  18.         //パラメータを取得する
  19.         String userName = req.getParameter("user_name");
  20.         String name = req.getParameter("name");
  21.         String email = req.getParameter("email");
  22.         String save = req.getParameter("save");
  23.         
  24.         //Cookieに保存するデータをURLエンコードする
  25.         userName = URLEncoder.encode(userName, "utf-8");
  26.         name = URLEncoder.encode(name, "utf-8");
  27.         email = URLEncoder.encode(email, "utf-8");
  28.         
  29.         //クッキーを準備する
  30.         Cookie unCookie = new Cookie("UserName", userName);
  31.         Cookie nCookie = new Cookie("Name", name);
  32.         Cookie eCookie = new Cookie("Email", email);
  33.         
  34.         //情報を保存するかどうかで分岐する
  35.         if(save != null && save.equals("save")){
  36.             //クッキーの有効期限を未来にセットする
  37.             unCookie.setMaxAge(60*60*24*30);
  38.             nCookie.setMaxAge(60*60*24*30);
  39.             eCookie.setMaxAge(60*60*24*30);
  40.         }else{
  41.             //クッキーの有効期限を未来にセットする
  42.             unCookie.setMaxAge(-1);
  43.             nCookie.setMaxAge(-1);
  44.             eCookie.setMaxAge(-1);
  45.         }
  46.         
  47.         //各クッキーを送信する準備をする
  48.         resp.addCookie(unCookie);
  49.         resp.addCookie(nCookie);
  50.         resp.addCookie(eCookie);
  51.         
  52.         //クライアントに出力する準備
  53.         resp.setContentType("text/html; charset=utf-8");
  54.         PrintWriter pw = resp.getWriter();
  55.         
  56.         //クライアントにHTMLタグを書き出す
  57.         pw.println("<html>");
  58.         pw.println("<head>");
  59.         pw.println("<title>クッキーに保存</title>");
  60.         pw.println("</head>");
  61.         pw.println("<body>");
  62.         pw.println(" クッキーに保存しました。<br>");
  63.         pw.println(" <a href='CookieTest2.jsp'>もどる</a>");
  64.         pw.println("</body>");
  65.         pw.println("</html>");
  66.     }
  67. }

○ 実行結果

次のURLを入力して実行してみましょう。

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から取り出しています。それぞれ取り出したデータを45、47、49行目のフォーム部品の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にアクセスすると入力フォームの入力内容は表示されなくなります。

前へ   次へ