第 2 章 Servlet
2.3 サーブレットのプログラム例
2.3.3 前回アクセス時刻表示 testCookie.html................................................................................................43 testCookie.java.................................................................................................43
以下にCookieという仕組みを使って、前回アクセスした時刻を表示するサーブレットプログ
ラムの例を示します。
Cookieとは、ウェブサイトの提供者が、ウェブブラウザを通じてウェブサイト訪問者(ユー
ザ)のコンピュータに情報を保存させる機能です。Cookieにはユーザに関する情報や最後にサ イトを訪れた日時、そのサイトの訪問回数などを記録しておくことができます。主にユーザの識 別に使われ、認証システムや、WWW によるサービスをユーザ別にカスタマイズするパーソナ ライズシステムの要素技術として利用されています。
ここではサーバにアクセスしたときに、その時刻をウェブブラウザに送り返し、次にアクセス したときにはその情報を再びサーバに送って表示しています。
testCookie.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html;
charset=Shift_JIS">
4 <title>ログイン</title>
5 </head>
6 <body>
7 <form method="post" action="../../servlet/testCookie">
8 名前: <input type="input" name="username" size="20">
9 <input type="submit"value="login"/> <br>
10 </form>
11 </body>
12 </html>
testCookie.java
1 package jp.ac.u_tokyo.k.is.chapter2;
2
3 import java.io.*;
4 import javax.servlet.*;
5 import javax.servlet.http.*;
6 import java.util.Calendar;
7
8 public class testCookie extends HttpServlet{
9 public void doGet (HttpServletRequest request,
10 HttpServletResponse response) throws ServletException, IOException{
11 response.setContentType("text/html;charset=Shift-JIS");
12 PrintWriter out = response.getWriter();
13
14 String cookiename = "lastaccess";//セットするCookieの名前 15 String lastAccessTime = "はじめてのアクセス";
16
17 //クッキー一覧を取り出して必要とするクッキーがあるか 18 Cookie cookies[] = null;
19 if ((cookies = request.getCookies()) != null) { 20 for (int i=0; i<cookies.length; i++) {
21 if (cookies[i].getName().equals(cookiename)) { 22 try {
23 lastAccessTime = (String)(cookies[i].getValue());
24 } catch (Exception e) { 25 lastAccessTime = "エラー";
26 } 27 } 28 } 29 }
30 //クッキーを再セット
31 String now = Calendar.getInstance().getTime().toString();
//現在時刻 32 Cookie cookie = new Cookie(cookiename, now);
33 response.addCookie(cookie);
34
35 //HTMLを表示
36 out.println("<html><head>");
37 out.println("<title>testCookie</title>");
38 out.println("</head>");
39 out.println("前回アクセス:" + lastAccessTime);
40 out.println("</body></html>");
41 }
42 protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { 43 doGet(request, response);
44 } 45 }
それでは、特徴的な部分についてみていくことにします。
まず、以下の部分ではクッキーを読み込んでいます。
17 //クッキー一覧を取り出して必要とするクッキーがあるか 18 Cookie cookies[] = null;
19 if ((cookies = request.getCookies()) != null) { 20 for (int i=0; i<cookies.length; i++) {
21 if (cookies[i].getName().equals(cookiename)) { 22 try {
23 lastAccessTime = (String)(cookies[i].getValue());
24 } catch (Exception e) {
25 lastAccessTime = "はじめてのアクセス";
26 } 27 } 28 } 29 }
まず、Cookieオブジェクトの配列としてcookiesを宣言します。request.getCookies()により ブラウザからサーバにページを要求する際、自動的に送信されるクッキー情報を取得します。
getCookies()メソッドはブラウザから送られてきたすべてのクッキーの配列を返し、もしクッキ
ーが無ければnullを返します。(cookies = request.getCookies()) != nullというのは、cookies が空ではない、つまりクッキーが存在した場合をあらわします。
また、20行目のcookies.lengthで配列の長さを取得し、配列の回数だけクッキーをチェック
します。getCookies()メソッド自体はHttpServletRequestオブジェクトのメソッドです。
また、21行目のcookies[i].getName().equals(cookiename)は取得したクッキー情報のクッキー
名が目的のクッキーlastaccessであるかどうかを判断します。
31~33行目では、クッキーを作成し、新しい時刻を代入しています。
31 String now = Calendar.getInstance().getTime().toString();
//現在時刻 32 Cookie cookie = new Cookie(cookiename, now);
33 response.addCookie(cookie);
30行目では、現在の時刻を取得して文字列nowに代入しています。その後、32行目で新た
なCookieオブジェクトを生成しています。名前と値を引数にクッキーオブジェクトを作成して、
作成したオブジェクトを引数にしてaddCookie メソッドを実行します。
ここでは、cookienameという名前とlastaccessという値をセットしています。また33行目
のaddCookieメソッドを使用することで、ブラウザに記録されます。