Cookieをブラウザに送る(2) 承前

次に、set-cookie およびブラウザに表する内容を Perlスクリプト で生成する例を紹介する。 併せて、ブラウザにCookieがドメイン名付きでで残っているかを実際に確かめてほしい。

CGIスクリプトでCookieを書き込む

ごく簡単なset-Cookieスクリプト

simple_cookie_from_meiji.cgiをクリックする。 このCGIスクリプト simple_cookie_from_meiji.cgi は次のように書かれており、実行属性を与えて明治大学に置かれているに置いてある。

#!/usr/bin/perl
use strict;
use warnings;

print <<"EOD";
Content-type: text/html
Set-Cookie: customer=taro; domain=isc.meiji.ac.jp; path=/;

<html>
<head>
<title>simple_cookie.cgi from Meiji</title>
</head>
<body>
<h1>simple_cookie.cgi from Meiji</h1>
Hello, Daito University!
</body>
</html>
EOD

単純にCookieをクライアントにセットだけのスクリプトで、サーバの応答ヘッダで次のように Set-Cookie したのと同じで、クッキー名は customer である。

Set-Cookie: customer=taro; domain=isc.meiji.ac.jp; path=/;

ここでのCookie寿命は明記されていないので、ブラウザを終了するまでがCookieの寿命である。

ブラウザからCookie値をWebサーバに伝えで Set-Cookieし、これを読み出すスクリプト

次に、sendshow_cookie_from_meiji.cgiをクリックする。 このスクリプト sendshow_cookie_from_meiji.cgi は次のように書かれており、実行属性を与えて関係するページと共に明治大学に置いた。 ここでのクッキーは、ブラウザから入力した文字列を パラメータ key 値とするようにし、さらに有効期限を30秒間としている。

#!/usr/bin/perl
use strict;
use warnings;
use CGI;

my $cgi = new CGI;
my $cookie_key = 'key';
my $cookie_from_client = $cgi->cookie($cookie_key);
my $param_from_client = $cgi->param($cookie_key);
my $cookie_to_client = $cgi->cookie(
    -name       => $cookie_key,
    -value      => $param_from_client,
    -expires    => '+30s',# life time: only 30 sec
   -path       => '/',
   -domain     => 'isc.meiji.ac.jp',
#   -secure     => 1,
);#ここまででCookie内容を設定。ただし、寿命は30秒!

if ($cgi->param('nowrite')) {
    print $cgi->header;
} else {
    print $cgi->header(-cookie => $cookie_to_client);# Cookieを表示
}
print $cgi->start_html('sendshow_cookie.cgi');
print $cgi->h1('sendshow_cookie.cgi');

# ブラウザからのパラメータを表示
print $cgi->h2('Parameter from This Client is:');
print $cgi->p($param_from_client);# input Cookie paraneter

# ブラウザに送ったCookieを表示
if ($cgi->param('nowrite')) {
    print $cgi->h2('Just sent Cookie to client was');
    print $cgi->p("(Already sent. No cookie is set)");
} else {
    print $cgi->h2('Cookie to client is:');
    print $cgi->p($cookie_to_client);
}

# ブラウザから送ったCookie値
print $cgi->h2('Just sent Cookie is');
print $cgi->p($cookie_from_client);

print $cgi->hr;

# サーバに送るパラメータ値
print $cgi->h2('Send parameter to Server');
print $cgi->start_form;
print $cgi->textfield($cookie_key);
print $cgi->submit('write');
print $cgi->end_form;

# 既に送ったパラメータ値(Cookie寿命30秒以内)を表示
print $cgi->h2('Just reload (not sent before 30 sec) parameter to server is shown above(at Just sent Cookie from is):');
print $cgi->start_form;
print $cgi->hidden(-name => 'nowrite', -value => 1);
print $cgi->submit('Just reload');
print $cgi->end_form;

print $cgi->end_html;

ブラウザから[Send parameter to Server]の後に入力した文字列が Cookieのパラメータ key の値となり、初めてサーバはブラウザにCookieを送り込み、その有効期間を Set-Cookie した時間から + 30 秒としている。

そのときのCookie内容は [Just sent Cookie to client was] の後に次のように示される。

key=abcdef; domain=isc.meiji.ac.jp; path=/; expires=Wed, 19-Jun-2013 13:42:15 GMT

演習

Cookieの30秒の有効期間内であれば、[Just Reload]ボタンを押すと、Cookie のパラメータ key 値を[Just sent Cookie is] の後に書き出す。 しかし、有効期間を過ぎたときにはCookieが削除されてしまい、[Just sent Cookie to client was] の後に (Already sent. No cookie is set) と表示され、もはやCookieがセットされていない状態であることを確認してほしい。