Cookieを使ったデータの保存

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

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

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

○ ファイル

 プロジェクトに次のようなServletを追加してください。

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

サンプルダウンロード

○ プログラム

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

  1. package test.servlet;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.Cookie;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. public class CookieTest extends HttpServlet {
  10.  @Override
  11.  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  12.   //クライアントに出力する準備
  13.   resp.setContentType("text/html; charset=utf-8");
  14.   PrintWriter pw = resp.getWriter();
  15.   //クライアントにHtmlタグを書き出す
  16.   pw.println("<html>");
  17.   pw.println("<head>");
  18.   pw.println("<title>クッキーに保存</title>");
  19.   pw.println("</head>");
  20.   pw.println("<body>");
  21.   pw.println(" <form method=\"POST\">");
  22.   pw.println(" ブラウザーのメモリにクッキーを保存してデータを渡す<br>");
  23.   pw.println(" Email:");
  24.   pw.println(" <input type=\"text\" name=\"email\"><br>");
  25.   pw.println(" <input type=\"submit\" value=\"送信\">");
  26.   pw.println(" </form>");
  27.   pw.println("</body>");
  28.   pw.println("</html>");
  29.  }
  30.  @Override
  31.  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  32.   //パラメータを取得する
  33.   String mail = req.getParameter("email");
  34.   //クッキーを生成
  35.   Cookie cook = new Cookie("mail", mail);
  36.   //クッキーをセット
  37.   resp.addCookie(cook);
  38.   //違うページにリダイレクト
  39.   resp.sendRedirect("CookieTest.jsp");
  40.  }
  41. }

〇 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>CookieTest</servlet-name>
  3.   <servlet-class>test.servlet.CookieTest</servlet-class>
  4.  </servlet>
  5.  <servlet-mapping>
  6.   <servlet-name>CookieTest</servlet-name>
  7.   <url-pattern>/cookietest</url-pattern>
  8.  </servlet-mapping>

○ ファイル

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

ファイル名 CookieTest.jsp

サンプルダウンロード

○ プログラム

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

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2.  pageEncoding="UTF-8"%>
  3. <%
  4. //クッキーを取得
  5. Cookie cookies[]=request.getCookies();
  6. String mail = null;
  7. if(cookies!=null){
  8.  for(int i=0;i<cookies.length;i++){
  9.   if(cookies[i].getName().equals("mail")){
  10.    //クッキーのデータを取得
  11.    mail=cookies[i].getValue();
  12.    break;
  13.   }
  14.  }
  15. }
  16. %>
  17. <!DOCTYPE html PUBLIC "-//W3C//DTD Html 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  18. <html>
  19. <head>
  20. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  21. <title>クッキーで受信</title>
  22. </head>
  23. <body>
  24.  Cookieを使ってデータを受け取る<br>
  25.  Email:<%= mail %>
  26. </body>
  27. </html>

○ 実行結果

http://localhost:8080/WebApp/cookietest

実行結果
実行結果

○ 解説

 クライアントにクッキーを設定するには、応答に付加して送信します。CookieTestクラスの42行目でクライアントに送信するCookieオブジェクトを生成しています。コンストラクタの引数で、クッキー名と保存するデータを指定します。その後45行目で、HttpServletResponseオブジェクトに用意したクッキーを追加しておくことで、応答時にクライアントに渡されるようになります。

 保存してあるクッキーは要求時にサーバーに送られてくるので、HttpServletRequestオブジェクトからCookieを取得することができます。CookieTest.jspの5行目でCookieを取得しています。Cookieは複数保存することができるので、取得するときにはCookieの配列として取得します。9~15行目で複数あるCookieから目的のCookieを取り出し、12行目でCookieに保存してあるデータを取り出しています。そして26行目で取り出したデータをWebブラウザーに表示する記述をしています。

前へ   次へ