Cookieを使ったデータの保存
Cookieとは、Webクライアントのコンピューターに情報を保存させておく仕組みのことです。クライアントサーバ形式のアプリケーションでは技術的にはサーバーからクライアントを操作することはできます。しかし、それによってセキュリティー上の問題が発生します。状況によってはハードディスクの中身を全部消去されかねません。そこで、クライアント側のリソースをサーバー側で操作できないようになっています。
しかし、どうしてもクライアント側にデータを保存しないと不便な場合があります。そこで、少量のデータをハードディスク内に保存する仕組みが用意されています。それがCookieです。Cookieはデータを保存する目的以外にも、セッションを管理したり、ログイン状態を保持したりするときにも使用されます。
まず、メモリ上にCookieを保存する方法を見てみましょう。この方法はWebブラウザーを閉じると保存しているデータは消えてしまいます。
○ ファイル
プロジェクトに次のようなServletを追加してください。
パッケージ名 | test.servlet |
---|---|
クラス名 | CookieTest |
スーパークラス名 | javax.servlet.http.HttpServlet |
○ プログラム
doGetメソッド、doPostメソッドを追加して、次のようにプログラムを入力してください。
CookieTest.java
- package test.servlet;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.Cookie;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- @WebServlet("/cookietest")
- public class CookieTest extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //クライアントに出力する準備
- resp.setContentType("text/html; charset=utf-8");
- PrintWriter pw = resp.getWriter();
- //クライアントにHTMLタグを書き出す
- pw.println("<html>");
- pw.println("<head>");
- pw.println("<title>クッキーに保存</title>");
- pw.println("</head>");
- pw.println("<body>");
- pw.println(" <form method=\"POST\">");
- pw.println(" ブラウザーのメモリにクッキーを保存してデータを渡す<br>");
- pw.println(" Email:");
- pw.println(" <input type=\"text\" name=\"email\"><br>");
- pw.println(" <input type=\"submit\" value=\"送信\">");
- pw.println(" </form>");
- pw.println("</body>");
- pw.println("</html>");
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //パラメータを取得する
- String mail = req.getParameter("email");
- //クッキーを生成
- Cookie cook = new Cookie("mail", mail);
- //クッキーをセット
- resp.addCookie(cook);
- //違うページにリダイレクト
- resp.sendRedirect("CookieTest.jsp");
- }
- }
○ ファイル
次に受信するJSPファイルを作成します。プロジェクトに次のようなファイルを追加してください。
ファイル名 | CookieTest.jsp |
---|
○ プログラム
次のようにプログラムを入力してください。
CookieTest.jsp
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%
- //クッキーを取得
- Cookie cookies[] =request.getCookies();
- String mail = null;
- if(cookies != null){
- for(Cookie cookie : cookies){
- if(cookie.getName().equals("mail")){
- //クッキーのデータを取得
- mail = cookie.getValue();
- break;
- }
- }
- }
- %>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>クッキーで受信</title>
- </head>
- <body>
- Cookieを使ってデータを受け取る<br>
- Email:<%= mail %>
- </body>
- </html>
○ 実行結果
次のURLを入力して実行してみましょう。
http://localhost:8080/WebApp/cookietest
○ 解説
クライアントにクッキーを設定するには、応答に付加して送信します。CookieTestクラスの44行目で、クライアントに送信するCookieオブジェクトを生成しています。コンストラクターの引数で、クッキー名と保存するデータを指定します。その後47行目で、HttpServletResponseオブジェクトに用意したクッキーを追加しておくことで、応答時にクライアントに渡されるようになります。
保存してあるクッキーは要求時にサーバーに送られてくるので、HttpServletRequestオブジェクトからCookieを取得することができます。CookieTest.jspの5行目でCookieを取得しています。Cookieは複数保存することができるので、取得するときにはCookieの配列として取得します。9~15行目で複数あるCookieから目的のCookieを取り出し、12行目でCookieに保存してあるデータを取り出しています。そして26行目で取り出したデータをWebブラウザーに表示する記述をしています。