|
任意の情報をユーザのコンピュータに保存したり、保存したものを取り出したりする事が出来ます。
それがクッキーです。
クッキーを利用する事によって例えば掲示板に記事を投稿する場合、2度目からは名前等が既にフォームに入力されている状態を作り出す事が出来ます。
|
|
■クッキー情報の保存
クッキー情報をユーザのコンピュータに保存する方法です。
|
|
|
print "Set-Cookie: クッキー名=クッキーデータ; expires=期限\n";
|
|
|
クッキー名は任意の名前です。
クッキー情報を取り出す場合は、このクッキー名を元にクッキーデータを取り出す事になります。
クッキーデータは掲示板の例でいうと名前やEメールやURL等です。
私の場合はこれを区切り文字「<>」でひとまとめにしています。
クッキー名を「BBS」としてクッキーデータを保存するには以下のようにクッキーヘッダを出力します。
|
|
$cookie_data = "$name<>$email<>$url";
print "Set-Cookie: BBS=$cookie_data; expires=期限\n";
|
|
□期限
いつまでクッキー情報を保存するのかをexpiresで指定する必要があります。
期限はGMT(グリニッジ標準時)で指定する事になっていますのでgmtime関数を使用します。
|
|
Friday, 01-Jan-2010 23:10:50 GMT
期限は上記のような書式で指定する必要がありますのでsprintf関数で書式を整えます。
|
|
□出力する場所
クッキーヘッダを出力する場所は以下のようにMIMEヘッダ出力の間で行います。
|
|
print "Content-type: text/html\n";
print "Set-Cookie: BBS=$cookie_data; expires=期限\n";
print "\n";
|
|
|
以下はクッキーヘッダの出力をサブルーチン化した例です。
ここではクッキー情報を60日間保存するようにしています。
|
|
sub set_cookie {
@w = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday);
@m = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
($sec, $min, $hour, $day, $mon, $year, $week) = gmtime(time + 60*24*60*60);
$gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",
$w[$week], $day, $m[$mon], $year + 1900, $hour, $min, $sec);
$cookie_data = "$name<>$email<>$url";
$cookie_data =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
print "Set-Cookie: BBS=$cookie_data; expires=$gmt\n";
}
2バイト文字や一部の記号をそのままクッキーデータとして使用すると不具合が生じる為、半角英数字以外を%に続く16進コードに置換する処理を付け加えています。
|
|
■クッキー情報の取り出し
保存されているクッキー情報は環境変数$ENV{'HTTP_COOKIE'}に格納される事になっています。
ここではクッキーデータは区切り文字を「<>」として保存していますので具体的には以下のように格納されています。
|
|
BBS=$nameの内容<>$emailの内容<>$urlの内容
これを取り出せば良い事になります。
|
|
sub get_cookie {
@cookie = split(/; /, $ENV{'HTTP_COOKIE'});
foreach (@cookie) {
($cookie_name, $cookie_val) = split(/=/, $_);
if ($cookie_name eq 'BBS') {
$cookie_val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
@bbs_cookie = split(/<>/, $cookie_val);
last;
}
}
$bbs_name = $bbs_cookie[0];
$bbs_email = $bbs_cookie[1];
$bbs_url = $bbs_cookie[2];
}
|
|
環境変数$ENV{'HTTP_COOKIE'}の内容を「; 」(セミコロン+半角スペース)の区切り文字でsplitしています。
これは同一サーバの同一フォルダ内にあるCGIで複数のクッキー情報を保存している場合は「; 」を区切り文字として、まとめて$ENV{'HTTP_COOKIE'}に取り出される為です。
取り出したクッキーデータ$cookie_valは16進コードに置換して保存しましたので元に戻す処理を忘れずに行います。
|
|
□更新履歴
2007.04.26 全体的に内容を見直し
2006.01.18 2バイト文字の置換処理部分を修正
|
|
|