GO BACK

JSP教室 その4


「クッキーを使う」


■クッキーを保存する

 各ユーザごとに何かの情報を保存しておきたいと思うときに利用されるのが「クッキー」です。クッキーといえば、もちろんお菓子のことではなく て、Webブラウザに保存できるちょっとした情報のことですね。クッキーは、各サイトごとに保存することができます。1つだけでなく、同時に幾つもの値を 保存可能です。ただし、Webブラウザの設定によっては保存できないようにすることも可能なので万能というわけではありませんが、ちょっとした情報を保存 しておきたいときには重宝します。

 このクッキーは、もちろんJSPからも利用することができます。では、クッキーを読み書きする簡単なサンプルを考えてみましょう。――まず は、クッキーを保存するサンプルからです。ここでは例として、ページを開くとランダムな数字を「ID」という名前のクッキーに保存する、というサンプルを 作ってみましょう。 


<html>
<head>
<%@ page contentType="text/html;charset=Shift_JIS" %>
<%@ page pageEncoding="Shift_JIS" %>
<%@ page import="java.util.*" %>
</head>
<body>
<h3>クッキーの保存</h3>

<%
request.setCharacterEncoding("Shift_JIS");
int id = Math.abs(new Random().nextInt());
String value = Integer.toString(id);
Cookie ck1 = new Cookie("id",value);
ck1.setMaxAge(60 * 60 * 24 * 7);
response.addCookie(ck1);
out.println("クッキーに保存したあなたのID:" + value);
%>
</body>
</html>


  アクセスすると、このようにランダムな数字がIDとしてクッキーに保存された旨が表示されます。――ここでは、以下のような形でクッキーを作成しています ね。

[Cookie] = new Cookie( 名前 , 値 );

 Cookieクラスというのが、クッキー情報のクラスです。これは、クッキーの名前と設定する値の2つを引数に指定して作成します。どちらも String値でなければいけません。

 次に、作成したクッキーの保存期間を設定します。これは行なわなくてもいいんですが、そうするとWebブラウザを終了するとそのままクッキーは消えてし まいます。一定期間クッキーを保管したければ、最大保存期間の指定を行なっておかないといけません。

[Cookie].setMaxAge( int値 );

 このsetMaxAgeで期間を指定します。これは秒数を示すint値となります。ここでは、60 * 60 * 24 * 7 = 7日間を設定しているわけですね。

 こうしてクッキーを作成しても、まだこのままではブラウザには保存されません。作成したクッキーのインスタンスをWebブラウザに追加する処理をしてや ります。これは、以下のように行ないます。

response.addCookie( [Cookie] );

 これで作成したクッキーはWebブラウザに保存されます。以上、「Cookieインスタンスの作成」「最大保存期間の設定」「Webブラウザへの追加」 という3つの作業をセットで行って、初めてクッキーがブラウザに保存できるわけです。


■クッキーを読み込む

 では次に、クッキーをWebブラウザから読み込んで使う方法について説明しましょう。これも、先ほど保存したクッキー「id」を読み込んで表示するサン プルを作って説明することにします。

<html>
<head>
<%@ page contentType="text/html;charset=Shift_JIS" %>
<%@ page pageEncoding="Shift_JIS" %>
</head>
<body>
<h3>クッキーチェック!</h3>

<%
request.setCharacterEncoding("Shift_JIS");
String value = "";
Cookie[] ck = request.getCookies();
boolean flg = false;
if (ck != null) {
for(int i = 0;i < ck.length;i++) {
String name = ck[i].getName();
if (name.equals("id")){
value = ck[i].getValue();
flg = true;
out.println("こんにちは。あなたのIDは、"
+ value + "です!");
break;
}
}
}
if (flg == false)
out.println("残念! まだIDが保存されていません。");

%>

</body>
</html>



 このページにログインすると、先ほど保存したクッキーを読み込み、あなたのIDを画面に表示します。もし、IDのクッキーがWebブラウザから見つから ないと、その旨を画面に表示します。



 ここでは、クッキーの情報を以下のようにして取り出しています。

[Cookie]配列 = request.getCookies();

 これで、現在Webブラウザに保存されている(そのサイトの)クッキーすべてが配列として返されます。クッキーは1つしか保存できないわけではありませ ん。従って、このように保存したクッキー全てを取り出して処理するようになっているのですね。もし、そのサイトのクッキーが存在しなければ、この getCookiesの値はnullとなります。

 取り出したCookieインスタンスは、以下の2つのメソッドを使って、クッキーの名前とその値をそれぞれ取り出すことができます。

・名前を取り出す
 String変数 = [Cookie].getName();

・値を取り出す
 String変数 = [Cookie].getValue();

 こうして取り出したCookie配列から必要なクッキーを探し出せばいいのですが、ここでちょっと面倒なことに遭遇します。Cookieインスタンス は、それが何の値を保存しているものか、1つ1つのCookieを調べていかないとわからない、という点です。つまり、「この名前のクッキー」というよう に、名前でぱっと検索したりできないのです。

 したがって、繰り返しを使ってすべてのクッキーの名前をgetNameして必要なクッキーかチェックする、ということをしないといけません。リストでは forを使ってその処理を行なっています。どうやって必要なクッキー「id」の値を取り出しているか、考えてみるとよいでしょう。


■他のページにジャンプする

 さて、これで一応、クッキーを使った処理はできるようになりましたが、「おまけ」ということで、もうちょっと手を入れてみましょう。クッキーが見つから ないときには、あらかじめ用意しておいたエラーページにジャンプするようにしてみましょう。

 まず、エラーページのJSPを用意しましょう。ここでは以下のスクリプトを「error.jsp」というファイルで用意することにします。

<html>
<head>
NO COOKIE!!
<%@ page contentType="text/html;charset=Shift_JIS" %>
<%@ page pageEncoding="Shift_JIS" %>
</head>
<body>
<h3>クッキーが見つかりません!</h3>
※クッキーがWebブラウザに見つかりません。
まず、IDの保存ページにアクセスしてください。
</body>
</html>

 続いて、先ほど作成したクッキー読み込みのJSPを修正してみます。たった1行だけ修正するだけなので簡単ですね。

<html>
<head>
<%@ page contentType="text/html;charset=Shift_JIS" %>
<%@ page pageEncoding="Shift_JIS" %>
</head>
<body>
<h3>クッキーチェック!</h3>

<%
request.setCharacterEncoding("Shift_JIS");
String value = "";
Cookie[] ck = request.getCookies();
boolean flg = false;
if (ck != null) {
for(int i = 0;i < ck.length;i++) {
String name = ck[i].getName();
if (name.equals("id")){
value = ck[i].getValue();
flg = true;
out.println("こんにちは。あなたのIDは、"
+ value + "です!");
break;
}
}
}
if (flg == false)
pageContext.forward("error.jsp"); // ★

%>

</body>
</html>




 リストの★マークの1行が書き換えた部分です。これで、クッキーが見つからないと、error.jspにジャンプするようになります。

 ここでは、以下のようなメソッドを呼び出して他のページにジャンプをしています。

pageContext.forward( ページの指定 );

 これをJSPのコード内に記述しておくと、その時点で指定のページにジャンプします(従って、何かページに表示するような処理があったとしても表示され ません)。必要に応じて他のページにジャンプするという処理はJSPではけっこう多用されるので覚えておくと便利でしょう。


GO NEXT


GO HOME