サーブレットの様々なサンプル - Cookie の操作 -
技術情報 TOP へ

ここでは、Java サーブレットに関する簡単なサンプルを記述いたします。

( 1 ) クッキーの送信
( 2 ) クッキーの取得
( 3 ) クッキーを利用したクライアントアクセスカウンタ



クッキーについて

クッキーとは Web サーバ側が、ブラウザを通じてユーザ ( クライアント側 ) に簡単な小さなデータを書き込み、 そのユーザの情報とサーバ間の情報を保存する仕組みです。

このクッキーの仕組みにより、ユーザID の保存やそのユーザに関する設定情報などを保存しておき、
再度、そのサーバにアクセスがあったときにブラウザはクッキーを送信して、前回アクセスしたときの
情報を使用することができます。

クッキーを利用する際には以下の点に留意することが必要です。

有効期限の設定 ( 無期限の設定も可 )

適切な必要最低限の有効期限を設定します。


HTTP 通信上では、テキストで送信されるのでセキュリティを意識することが必要。

重要な情報はクッキーに保存しないようにします。


HTTPS 通信上では、secure 属性を必ず付与すること。

secure 属性を付与すると HTTPS から HTTP 通信に切り替わったとき、クッキーが送信されません。
( 暗号化されている通信から暗号化されていない通信に切り替わったとき、クッキーが送信されなくなります。)
secure 属性を付与しないと HTTPS から HTTP 通信に切り替わったときにテキストの状態でクッキーが送信されてしまいます。
secure 属性 の付与は通常、アプリケーションサーバ側で設定します。


クライアントの環境によっては、クッキーが利用できない場合がある。

クッキーはセッション ID などの情報の利用に用いられます。 セッション ID の保持を行うクッキーが利用できない場合の対策も検討しておく。( URL リライティングなど。 )

セッションについては以下のページを参照ください。

サーブレットの様々なサンプル - セッションの管理 -





( 1 ) クッキーの送信

リクエストを送信してきたブラウザに対して、3 種類のクッキーを送信します。
  • 現在使用しているブラウザが閉じられるまで有効なクッキー
    クッキー名称:Cookie-Test1 値:Bule

  • 有効期限が120秒のクッキー
    クッキー名称:Cookie-Test2 値:Yellow

  • 有効期限が無期限のクッキー
    クッキー名称:Cookie-Test3 値:White
* ブラウザに Internet Explorer を使用されている場合は、[ツール] - [インターネットオプション] - [プライバシー] - [詳細設定] -
[自動 Cookie 処理を上書きする] にチェックを入れ、 [ダイアログを表示する]を選択すると クッキー が送信されてくる様子を確認
できます。

ファイル名:CookieServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class CookieServlet extends HttpServlet {
		
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request,HttpServletResponse response)
	  		throws IOException,ServletException {
	
	  response.setContentType("text/html; charset=shift_jis");

	
	  /* 現在使用しているブラウザが閉じられるまで有効なクッキー */
	  Cookie cookie1 = new Cookie("Cookie-Test1","Bule");
	  response.addCookie(cookie1);

	
	  /* 有効期限が120秒のクッキー */
	  Cookie cookie2 = new Cookie("Cookie-Test2","Yellow");
	  cookie2.setMaxAge(120);
	  response.addCookie(cookie2);
	
	  /* 有効期限が無期限のクッキー */
	  Cookie cookie3 = new Cookie("Cookie-Test3","White");
	  cookie3.setMaxAge(Integer.MAX_VALUE);
	  response.addCookie(cookie3);

	  PrintWriter out = response.getWriter();
	
	  out.println("<html>");
	  out.println("<head>");
	  out.println("<title>Cookie Example</title>");
	  out.println("</head>");
	  out.println("<body>");
	  out.println("<h2>Cookie を 3種類送信しました。</h2>");
	  out.println("</body>");
	  out.println("</html>");
	  out.close();
	
	}
}



( 2 ) クッキーの取得

ブラウザが送信してきたクッキー情報を取得します。

* 前回に同じドメイン、コンテキストパス ( 例:http:/www.aaa.co.jp/bbb/ ) にアクセスした時の有効期限が切れていない クッキーがブラウザから送信されます。( 自サーバから設定したクッキーの情報しか取得することはできません。)

ここでは、上述の ( 3 ) で設定したクッキーを取得してみます。上述の ( 3 ) ではクッキーの有効期限を設定しているものと 無期限にしているものがあります。( 無期限に設定した Cookie-Test3 が取得できると思います。)

ファイル名:CookieServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class CookieServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doGet (HttpServletRequest request, HttpServletResponse response)
	  	throws ServletException, IOException {
	  
	  response.setContentType("text/html; charset=shift_jis");

	  /* クッキーを取得します。 */
	  Cookie cookies[] = request.getCookies();

	  PrintWriter out = response.getWriter();
	  
	  out.println("<html>");
	  out.println("<head>");
	  out.println("<title>Cookie Example</title>");
	  out.println("</head>");
	  out.println("<body>");
	  
	  /* クッキーが存在した場合、情報を表示します。 */
	  if (cookies != null && cookies.length > 0 ) {
	    out.println("<h2>クッキー情報</h2>");
	  	for(int i=0;i<cookies.length;i++) {
	  	  out.print ("Name = " + cookies[i].getName() + " : ");
	  	  out.println ("Value = " + cookies[i].getValue() + "<br>");
	  	}
	  } else {
	  	out.println ("<h2>クッキーの情報はありません。</h2>");
	  }
	  
	  out.println("</body>");
	  out.println("</html>");
	  out.close();
	}
}



( 3 ) クッキーを利用したクライアントアクセスカウンタ

クッキーを利用してクライアントが対象のページに何回アクセスしたかを表示します。

処理は下記のとおりです。
  • クライアント側に アクセスカウンタ用のクッキーがあるか確認。
  • アクセスカウンタ用のクッキーが存在すれば値( 数 ) を取得します。
  • アクセスカウンタ用のクッキーが存在しなければ、0 を設定します。
  • アクセスカウンタ用の値( 数 ) に +1 を行います。
  • アクセスカウンタ用の値をクッキーに設定してクライアント側へ送信。
  • HTML にアクセスカウンタ用の値を表示します。
ファイル名:CookieServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class CookieServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doGet (HttpServletRequest request,HttpServletResponse response)
	  	throws ServletException, IOException {
	  
	  response.setContentType("text/html; charset=shift_jis");

	  /* クッキーの名称 */
	  String cnt = "CountAdd"; 

	  /* カウント */
	  int num = 0; 

	  /* CountAdd に一致するクッキーが存在するかを確認して、
	    存在すれば値を取得、数値型に変換します。 */
	  Cookie cookies[] = null;
	  if ((cookies = request.getCookies()) != null) {
	  	for (int i=0;i < cookies.length; i++) {
	  	  if (cookies[i].getName().equals(cnt)) {
	  	  	num = Integer.parseInt(cookies[i].getValue());
	  	  }
	  	}
	  }

	  /* CountAdd の値 (アクセスの回数を加算します。)  */
	  num++; 

	  /* 有効期限が無期限のクッキーを設定します。( CountAdd ) */
	  Cookie cookie = new Cookie(cnt,Integer.toString(num));
	  cookie.setMaxAge(Integer.MAX_VALUE);
	  response.addCookie(cookie);

	  //HTMLを表示
	  PrintWriter out = response.getWriter();
	  out.println("<html>");
	  out.println("<head>");
	  out.println("<title>Cookie Example</title>");
	  out.println("</head>");
	  out.println("<body>");
	  out.println("<h2>");
	  out.println(String.valueOf(num) + " 回目のアクセスです。");
	  out.println("</h2>");
	  out.println("</body>");
	  out.println("</html>");
	  out.close();
	}
}



技術情報 TOP へ


Google
WWW を検索 whitemark.co.jp を検索
[ 株式会社ホワイトマーク TOP ]   [ 免責事項 ]

Copyright © 2006 by WhiteMark, All rights Reserved. Last Modified: 2006/05