第6章 クッキーの利用
クッキーの利用
homepage
# **クッキーの利用** ## **1.クッキーの作成** クッキーはクライアント側にデータを保存するためのものです。クッキーの利用手順としては、クライアントからアクセスがあった時にクッキーが既にあるかどうかを調べ、もしあればクッキー内に保存されている情報を取得します。もしクッキーが無いようなら新規にクッキーを作成してクライアントに保存することになります。 **Cookie** ``` public Cookie(java.lang.String name, java.lang.String value) ``` 1番目の引数には作成するクッキーのクッキー名を指定します。クッキー名にはASCIIか英数字しか使えません。また2番目の引数には保存したい情報を指定します。<br> 例えば、訪問回数を記録する為に「visited」という名前のクッキーを作成し、訪問回数を保存する場合には下記のようになります。<br> ``` Cookie cookie = new Cookie("visited", "1"); ``` これでクッキーが作成されました。<br> ## **2.クッキーをクライアントへ保存** 作成したクッキーをアクセスしてきたクライアントに保存します。ここでクライアントとは、このサーブレットが含まれるホームページを見に来た人のブラウザにクッキーを保存してもらうわけです。その為、ブラウザの設定でクッキーを受け取らない設定にしている人のブラウザにはクッキーは保存されません。<br> クッキーをクライアントのブラウザに保存する場合にも、同じように「HttpServletResponse」インターフェースのオブジェクトに対して行います。具体的には「HttpServletResponse」インターフェースで定義されている"addCookie"メソッドを使います。<br> ``` response.addCookie(cookie); ``` #### **例** **CookieTest.java** ``` package cookie; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; 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 { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html; charset=Utf-8"); PrintWriter out = response.getWriter(); Cookie cookie = new Cookie("visited", "1"); response.addCookie(cookie); out.println("<html>"); out.println("<head>"); out.println("<title>クッキーテスト</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>クッキーを保存しました</p>"); out.println("</body>"); out.println("</html>"); } } ``` #### **実行結果** <!--graph6-1.png --> <img src="https://i.loli.net/2019/06/27/5d147e66825c971477.png" width="40%" /> <br> ## **3.クッキーの取り出し** ここではクライアントから送信されたクッキーを取り出してみましょう。<br> クッキーは、クッキー名や値の他に、クッキーが作成されたWebサーバのドメイン情報などを合わせて保存します。そして同じWebサーバに再度アクセスした場合に、そのWebサーバから発行されたクッキーがあれば保存していたクッキーをサーバへ送信します。<br> クライアントから送信されてきたクッキーは、サーブレットの"doGet"や"doPost"メソッドの引数である「HttpServletRequest」インターフェースのオブジェクトから取り出すことが出来ます。"getCookies"メソッドを使います。<br> **getCookies** ``` public Cookie[] getCookies() ``` クライアントから送られてきた全てのクッキーをCookieクラスのオブジェクトの配列として取得します。クッキーは同一のサーバから違うクッキー名を使って複数のクッキーをクライアントに保存することが出来ますので、クライアントから送られてくるクッキーも1つとは限りません。<br> もしクッキーがクライアントに保存されておらずサーバに送られてきたクッキーが存在しない場合はnullを返します。 <br> ## **4.特定のクッキーの検索** 取得したCookieクラスのオブジェクトの配列の中から、特定のクッキー名を持つクッキーを探すにはクッキー名を1つ1つ調べるしかありません。「Cookie」クラスで用意されている"getName"メソッドを使います。<br> **getName** ``` public java.lang.String getName() ``` このメソッドを使って1つ1つクッキー名を取得し、取得したいクッキーを検索します。 <br> ## **5.クッキーの値を取得** 目的のクッキーが見つかれば、今度は「Cookie」クラスで用意されている"getValue"メソッドで設定されている値を取得することが出来ます。 **getValue** ``` public java.lang.String getValue() ``` ``` public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html; charset=Utf-8"); PrintWriter out = response.getWriter(); Cookie cookie[] = request.getCookies(); if (cookie != null){ for (int i = 0 ; i < cookie.length ; i++){ if (cookie[i].getName().equals("visited")){ String val = cookie[i].getValue(); } } } } ``` #### **例** **CookieTest1.java** ``` package cookie; 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("/CookieTest1") public class CookieTest1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html; charset=Utf-8"); PrintWriter out = response.getWriter(); Cookie cookie = new Cookie("visited", "1"); response.addCookie(cookie); out.println("<html>"); out.println("<head>"); out.println("<title>クッキーテスト</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>クッキーを保存しました</p>"); out.println("<a href=\"/ServletDoc/DispValue1\">クッキーを表示</a>"); out.println("</body>"); out.println("</html>"); } } ``` **DispValue1.java** ``` package cookie; 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("/DispValue1") public class DispValue1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); Cookie cookie[] = request.getCookies(); out.println("<html>"); out.println("<head>"); out.println("<title>クッキーを表示</title>"); out.println("</head>"); out.println("<body>"); if (cookie != null){ for (int i = 0 ; i < cookie.length ; i++){ if (cookie[i].getName().equals("visited")){ String val = cookie[i].getValue(); out.println("<p>"); out.println(cookie[i].getName()); out.println("="); out.println(val); out.println("</p>"); } } }else{ out.println("<p>クッキーが見つかりません</p>"); } out.println("<a href=\"/ServletDoc/DispValue1\">クッキーを再表示</a>"); out.println("</body>"); out.println("</html>"); } } ``` #### **実行結果** <!--graph6-2.png --> <img src="https://i.loli.net/2019/06/27/5d14841e4a9f397425.png" width="40%"/> <u>クッキーを再表示</u>をクリックしたら、以下のようになれます。 <!--graph6-3.png --> <img src="https://i.loli.net/2019/06/27/5d14841e8c17933313.png" width="40%"/> <br> ## **6.値の再設定** クッキーを取り出した後で、別の値を設定してみます。<br> 「Cookie」クラスで用意されている"setValue"メソッドで既存のクッキーに別の値を設定できます。 **setValue** ``` public void setValue(java.lang.String newValue) ``` 新しい値を設定したら、改めて"addCookie"メソッドを使ってクライアントに書き込む必要があります。<br> #### **例** **CookieTest2.java** ``` package cookie; 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("/CookieTest2") public class CookieTest2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html; charset=Utf-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>クッキーテスト</title>"); out.println("</head>"); out.println("<body>"); Cookie cookie[] = request.getCookies(); Cookie visitedCookie = null; if (cookie != null) { for (int i = 0; i < cookie.length; i++) { if (cookie[i].getName().equals("visited")) { visitedCookie = cookie[i]; } } if (visitedCookie != null) { int visited = Integer.parseInt(visitedCookie.getValue()) + 1; out.println("<p>"); out.println(visited); out.println("回目の訪問です。</p>"); visitedCookie.setValue(Integer.toString(visited)); response.addCookie(visitedCookie); } else { out.println("<p>初回の訪問です。</p>"); Cookie newCookie = new Cookie("visited", "1"); response.addCookie(newCookie); } } else { out.println("<p>初回の訪問です。</p>"); Cookie newCookie = new Cookie("visited", "1"); response.addCookie(newCookie); } out.println("<a href=\"CookieTest2\">再表示</a>"); out.println("</body>"); out.println("</html>"); } } ``` #### **実行結果** <!--graph6-4.png --> <img src="https://i.loli.net/2019/06/27/5d148581ebe5e80188.png" width="40%" /> <br> ## **7.有効期限の設定** 作成したクッキーはデフォルトで有効期限がブラウザが閉じるまでとなっています。ここでは有効期限を変更する方法を見ていきます。<br> 「Cookie」クラスで用意されている"setMaxAge"メソッドで有効期限を設定できます。<br> **setMaxAge** ``` public void setMaxAge(int expiry) ``` 有効期限は秒数で指定します。例えば1時間に設定したい場合には下記のようにします。 ``` Cookie cookie = new Cookie("visited", "1"); cookie.setMaxAge(3600); ``` デフォルトで設定されているように引数にマイナスの値を設定した場合、有効期限はブラウザが閉じるまでとなります。 #### **例** **CookieTest3.java** ``` package cookie; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/CookieTest3") public class CookieTest3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>クッキーテスト</title>"); out.println("</head>"); out.println("<body>"); Cookie cookie[] = request.getCookies(); Cookie visitedCookie = null; if (cookie != null){ for (int i = 0 ; i < cookie.length ; i++){ if (cookie[i].getName().equals("visited")){ visitedCookie = cookie[i]; } } if (visitedCookie != null){ int visited = Integer.parseInt(visitedCookie.getValue()) + 1; out.println("<p>"); out.println(visited); out.println("回目の訪問です。</p>"); visitedCookie.setValue(Integer.toString(visited)); visitedCookie.setMaxAge(180); response.addCookie(visitedCookie); }else{ out.println("<p>初回の訪問です。</p>"); Cookie newCookie = new Cookie("visited", "1"); newCookie.setMaxAge(180); response.addCookie(newCookie); } }else{ out.println("<p>初回の訪問です。</p>"); Cookie newCookie = new Cookie("visited", "1"); newCookie.setMaxAge(180); response.addCookie(newCookie); } out.println("<a href=\"cookietest3\">再表示</a>"); out.println("</body>"); out.println("</html>"); } } ``` #### **実行結果** <!--graph6-5.png --> <img src="https://i.loli.net/2019/06/27/5d148645d0c9263887.png" width="40%" />
content
戻る