JSP & Servlet-5日目(Cookie)

JSP&Servlet

ブラウザに一時的にデータを保存するCookieを学ぼう。まずはControllerとviewを作成
●controller.Index.java

package controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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("/index")
public class Index extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		boolean countExists=false;//Cookieにcountが存在するか?
		 int count=1;//現在のカウント
		 Cookie cookie=null;//Cookie変数を宣言
		 Cookie[] cookies=request.getCookies();//送信されているCookieを取得(Cookieが送信されていなかったらnull)
		 //Cookieが送信されていた場合
		 if(cookies !=null){
			 //特定のキーのCookieがあるかどうかは一つずつ調べるしかない
			 for(Cookie c:cookies){
				 //countというcookieがあるか
				 if(c.getName().equals("count")){
					 //cookieからcountを取り出して1増やす
					 count=Integer.parseInt(c.getValue()) +1;
					 //新しくcountをキーにしてCookieを生成する
					 cookie=new Cookie("count",String.valueOf(count));
					 //cookieの有効期限を秒で設定(下は90日)
					 cookie.setMaxAge(60*60*24*90);
					 //レスポンスヘッダーにcookieを詰める
					 response.addCookie(cookie);
					 //countが存在したのでtrue
					 countExists=true;
					 //見つかったら探索をやめてループを抜ける
					 break;
				 }
			 }
		 }
		 //countというクッキーが送信されていなかった場合
		 if(!countExists){
			 //新しくCookieを生成
			 cookie=new Cookie("count","1");
			 cookie.setMaxAge(60*60*24*90);
			 response.addCookie(cookie);
		 }
		 //現在のカウントをviewで使えるようにリクエストスコープに詰める
		 request.setAttribute("count", String.valueOf(count));
		 //フォワード処理
		 RequestDispatcher rd=request.getRequestDispatcher("/WEB-INF/view/index.jsp");
		 rd.forward(request,response);	 
	}
}

●WEB-INF/view/index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String count=(String)request.getAttribute("count");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>クッキーの練習</title>
</head>
<body>
<p>あなたは<%=count %>回目の訪問です。</p>
</body>
</html>

実行してみて、以下のように表示されれば成功だ。

ブラウザをリロードしてみよう。訪問回数が一つずつ増えていくはずだ。

[クッキーとは]
一言でいうとブラウザにデータを保存する仕組みだ。サーバーからクライアントに対して任意のテキストデータを保存することができ、それをアプリ側から利用することができる。先程の例では訪問回数をブラウザに保存しそれを利用してアプリを作成した。

[クッキーの確認]
それでは保存されているデータを確認してみよう。
今回はChromeを使用する。
1.URLを入力し、さきほどの画面を表示させる。
2.デベロッパーツールを開く(Win:ctr+shift+i,Mac:command+option+i)
3.アプリケーションからホストを選択し、countというクッキーが保存されていることを確認する。

4.ブラウザをリロードするとこのクッキーの値も増えていくことを確認する。

[クッキーの利用]
このように、クッキーはデータの閲覧も改ざんも消去もとても簡単にできる。なので重要な情報などはやり取りできない。しかもあくまでもブラウザに保存しているので、他のWebブラウザを使用すると情報が維持されない点にも注意が必要だ。

[クーキー送受信の流れ]

クッキーの送受信はリクエスト、レスポンス間のヘッダーにて行われる。クッキーを利用する際はこの処理の流れを頭の中にイメージしながらやることが大切だ。

クッキーの基本を学んだところでさっそく練習問題をやってみよう。

Q1.クッキーを利用して、一度名前をe-mailを入力すると、以後は入力を省略できるアプリを作成せよ。
[実行例]
●スタート画面:最初は空白のフォームが表示される。

●情報を入力する

●送信ボタンを押す

●再びアクセスすると、名前とe-mailが入力済みとなっている。

[解答例]
●controller.CookieLesson.java

package controller;

import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.RequestDispatcher;
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;

/**
 * Servlet implementation class CookieLesson
 */
@WebServlet("/sample")
public class CookieLesson extends HttpServlet {
	private static final long serialVersionUID = 1L;

    
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name="";
		String email="";
		Cookie[] cookies=request.getCookies();
		if(cookies !=null) {
			for(Cookie  c:cookies) {
				if(c.getName().equals("name")) {
					name=URLDecoder.decode(c.getValue(),"UTF-8");
				}
				if(c.getName().equals("email")) {
					email=URLDecoder.decode(c.getValue(),"UTF-8");
				}
				if(!name.isEmpty() && !email.isEmpty()) {
					break;
				}
			}
		}
		request.setAttribute("name", name);
		request.setAttribute("email", email);
		RequestDispatcher rd=request.getRequestDispatcher("/WEB-INF/view/form.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String name=request.getParameter("name");
		String email=request.getParameter("email");
		Cookie[] cookies= {new Cookie("name",URLEncoder.encode(name,"UTF-8")),new Cookie("email",URLEncoder.encode(email,"UTF-8"))};
		for(Cookie c:cookies) {
			c.setMaxAge(60*60*24*180);
			response.addCookie(c);
		}
		RequestDispatcher rd=request.getRequestDispatcher("/WEB-INF/view/result.jsp");
		rd.forward(request, response);
	}

}

●WEB-INF/view/form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String name=(String)request.getAttribute("name");
String email=(String)request.getAttribute("email");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Insert title here</title>
</head>
<body>
<form action="/joytas5/sample" method="post">
名前:<input type="text" name="name" value="<%=name %>"><br>
e-mail:<input type="email" name="email" value="<%=email %>"><br>
<input type="submit" value="送信">
</form>
</body>
</html>

●WEB-INF/view/result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Insert title here</title>
</head>
<body>
<p>クッキーに登録しました!</p>
</body>
</html>

コメント

タイトルとURLをコピーしました