servletとjspコアプログラミング(第2版)第8章クッキー管理学習ノート

6558 ワード

第八章クッキー管理
コアメソッド:
1.クッキーオブジェクトを作成した後、クライアントプログラムにクッキーを送信する前に、setMaxAgeメソッドを呼び出すのが一般的です.
2.クッキーがWebサイトに適用されるすべてのURLを指定する場合は、クッキー.setPath("/")を使用します.つまり、すべてのページがクッキーを受け入れます.
警告:
1.Cookieオブジェクトの作成および操作は、クライアント・プログラムに影響を及ぼさず、response.addCookieを使用してクライアントにクッキーを明示的に送信する必要があります.
学習ノート
一、クッキーの長所
1.電子商取引セッションでユーザーを表示します.
2.ユーザー名とパスワードを記録します.
3.サイトをカスタマイズし、ユーザーが自分でホームページの外観をカスタマイズします.ユーザーは、見たい天気予報などを選択します.
4.指向広告.クッキーがある場合、以前の検索を記録することで、これらのサイトは私たちの興味を識別することができ、ランダムな広告ではなく、私たちの興味のある広告を表示することができます.
二、クッキーに存在するいくつかの問題
クッキーによるプライバシー問題を解決するために.
1.クッキーを無効にした場合にもユーザに合理的な機能を提供することができる.
2.servletおよびjspで使用されるクッキーとして、特に敏感な情報をクッキーで格納することをできるだけ避ける.
三、クッキーの送信と受け入れ
1.クライアントプログラムにクッキーを送信
a.クッキーオブジェクトを作成し、クッキーの名前とクッキーの値を与えます.両方とも文字列です.
Cookie c =new Cookie("userID","a1234")
.
b.クッキーを作成してブラウザに送信する場合、デフォルトでは、ブラウザのメモリに格納されたセッションレベルのクッキーであり、ブラウザを閉じると削除されます.ブラウザがクッキーをディスクに格納する場合は、maxAgeを使用して秒単位の時間を与える必要があります.
cookie.setMaxAge(60*60*24*7);//one week.              

c.クッキーをhttp対応ヘッダに入れる
response.addCookie();

以上より、
Cookie userCookie  = new Cookie("user","uid1234");
	userCookie.setMaxAge(60*60*24*365);
	response.addCookie(userCookie);

2.クライアントからクッキーを読み込む
a.request.getCookies()を呼び出してCookieオブジェクトの配列を返し、
b.Cookie配列をループし、cookieの配列ができたら、CookieのgetNameメソッドを呼び出して、希望する名前と一致するオブジェクトを見つけるまで知ります.
以上より、
String cookieName = "userID";
	Cookie [] cookies = request.getCookies();
	for(int i = 0  ; i  <cookies.length; i++){
		Cookie cookie = cookies[i];
		if(cookieName.equals(cookie.getName())){
			doSomething(cookie.getValue());
		}
	}

四、クッキーを用いて初訪者を検査する
クッキー配列がnullであるからといって、ユーザがクッキーを削除または無効にした結果である可能性があるため、クッキー配列がnullであるからといって、ユーザが最初のユーザであるとは思えない.ただし、配列がnullでない場合は、お客様がWebサイトにアクセスしたことを示すだけで、servletにアクセスしたことは説明できません.
五、クッキー属性の使用
1.cookie属性は、サーバ側からクライアントに出力されるcookieにのみ適用され、サーバ側のブラウザからのcookieはこれらの属性を設定していないので、request.getCookiesを設定して得られるcookieでこれらの属性を使用することは望ましくない.すなわち,サーバ側でこれらの値を設定してクライアントに送信するが,これらの属性はブラウザがサーバに返すヘッダに存在しないため,これらのクッキーの属性を取り出すこともできない.クッキーは、ユーザに関する情報を保存するためにクライアントに使用されるため、このように理解される.サーバ側ではこれらの特性は必要ありません.
2.setPath()は、パスが指定されていない場合、ブラウザは、そのクッキーを送信ページが存在するディレクトリまたは下のURLにのみ返し、setPath("/")は、サーバのすべてのページがそのクッキーを受信べきであることを指定する.
3.一般的にクッキーの名前と値はクッキーの構造方法で設定されているので、クッキーの名前と値を設定するのではなく、クッキーのgetNameとgetValueだけを使用してクッキーの名前と値を取得します.
六、持続クッキーと会話クッキーを区別する
response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		for(int i = 0 ; i < 3 ;i++){
			Cookie cookie = new Cookie("Session-Cookie"+i,"Cookie-Value-S"+i);
			response.addCookie(cookie);
		}
		for(int i = 0 ; i < 3 ; i++){
			Cookie cookie = new Cookie("Persistent-Cookie"+i,"Cookie-Value-P"+i);
			cookie.setMaxAge(60*60);
			response.addCookie(cookie);
		}
		Cookie [] cookies = request.getCookies();
		String cookieName ;
		String cookieValue ;
		
		out
				.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 

Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.println("<table>");
		out.println("<tr>"+"<th>CookieName</th>"+"<th>CookieValue</th>"+"</tr>");
		if(cookies==null){
			out.println("NO Cookies");
		}
		else{
			for(int i = 0 ; i < cookies.length;i++){
				Cookie cookie = cookies[i];
				cookieName = cookie.getName();
				cookieValue = cookie.getValue();
				out.println("<tr><td>"+cookieName+"</td>"+"<td>"+cookieValue

+"</td>"+"</tr>");
			}
		}
		
		
		out.println("</table>");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();

いくつかの状況を見てみましょう.まず、ブラウザを初めて開いたとき、No cookiesが表示されます.このとき、cookieをクライアントに送信するタスクが完了しただけです.2つのケースを見てみましょう.まずページをリフレッシュすると、
Session-Cookie0 Cookie-Value-S0
Session-Cookie1 Cookie-Value-S1
Session-Cookie2 Cookie-Value-S2
Persistent-Cookie0 Cookie-Value-P0
Persistent-Cookie1 Cookie-Value-P1
Persistent-Cookie2 Cookie-Value-P2
しかし、元のページを閉じてブラウザを再度開いてページにアクセスすると、表示されるのは
Persistent-Cookie0 Cookie-Value-P0
Persistent-Cookie1 Cookie-Value-P1
Persistent-Cookie2 Cookie-Value-P2
これは、セッションのクッキー(setMaxAgeが設定されていないクッキー)が現在のブラウズセッションにのみ存在し、ブラウザがオフになると存在しなくなり、持続的なクッキーはハードディスクに保存され、コンピュータをオフにしたりブラウザをオフにしたりすることで変化しません.
クッキーをハードディスクに保存し続ける時間を短くすると.
まず、設定時間を過ぎて初めて取得したブラウザクライアントを再リフレッシュすると、
Session-Cookie0 Cookie-Value-S0
Session-Cookie1 Cookie-Value-S1
Session-Cookie2 Cookie-Value-S2
ブラウザを閉じていないので、セッションクッキーは消えていません.最初にブラウザに送信された持続クッキーがハードディスクに格納される時間も最大の時間制限を過ぎているため、セッションクッキーの値が表示されます.
ブラウザを閉じ、設定時間を過ぎて再び開くと、No Cookieが表示されます.
七、クッキーの値を修正し、ユーザーのアクセス数を記録する.
クッキーの値を周期的に変更したい場合はどうすればいいですか?
同じクッキー名を送信するだけですが、異なるクッキーの値を使用してsetValueを呼び出すと、その値を設定する以外に、
setMaxAgeとsetPathも呼び出します.
String accessCount = CookieUtilities.getCookieValue(request, "accessCount", "1");
		int count = Integer.parseInt(accessCount);
		LongLivedCookie cookie = new LongLivedCookie("accessCount",String.valueOf(count+1));
		response.addCookie(cookie);
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		
		out
				.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 

Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.println("You are the "+count+"user");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();