Cookie(クッキー)はブラウザにデータを保存させるための新しい機構です。 ブラウザ依存性がどの程度あるのかは私は知りません。ご注意ください。
以前では閲覧者に関する個人データはサーバー側のファイルに保存され、
閲覧者は必要に応じてIDやパスワードを打ち込んで自分の個人データを
利用していました。
Cookieは、その個人データをクライアント側に保存させる新しい機構です。
それらのデータは必要に応じて自動的にサーバー側に提出されます。
この機構によってCGIは膨大な個人データの管理作業から解放されます。
このCookieの取り扱いについて解説します。
Cookieの発行、つまり作成されたデータをブラウザに保存させる方法には 2通りあります。ひとつはCGIのHTTPd headerのひとつとしてCookieを送る方 法。ふたつはJavaScriptを送り、ブラウザ内でCookieを発行させる方法です。 まずHTTPd headerで発行する方法を解説します。
CGIの先頭出力であるHTTPd headerに次のように Set-Cookieフィールド を追加します。
"name=value"がブラウザに保存させたいデータです。FORMの時とは異なり、 複数のデータの組をまとめることはできません。同様のSet-Cookieフィールド を複数行並べます。"expires="以降の日付は、ブラウザにこのデータを 保存してもらう期限を指定します。現在から1ヵ月後くらいが適当でしょう。 この項目を省略すると、データはブラウザの終了と共に消えます。 "path="以降のpathはこのデータを将来享受するCGI、ホームページファイル、 ディレクトリを指定します。この項目を省略するとCGIの所有者のディレクトリ 以下すべてが対象となります。printf( "Content-type: text/html\n" "Set-Cookie: name1=value1; expires=Man, 1-Jan-2001 00:00:00 GMT; path=/~naoki/cgi-bin/\n" "Set-Cookie: name2=value2; expires=Man, 1-Jan-2001 00:00:00 GMT; path=/~naoki/cgi-bin/\n" "\n" );
JavaScriptでcookieを発行するにはページの中で次のような JavaScriptのコマンドを実行します。
ページのどこで実行しても構いません。CGIでこのJavaScriptを出力しても 構いません。なので、CGIで headerを出力する段階で cookie用の データが完成できない場合には、後から JavaScript で cookieを発行することに なります。<SCRIPT LANGUAGE="JavaScript"> document.cookie = "name1=value1"; document.cookie = "name2=value2"; </SCRIPT>
こうしてCookieが発行されると、ブラウザはそのメモリまたはcookies ファイルにデータを記録します。そして、そのCookieが発行されたdomain とpathが一致するページへアクセスする際に自動的にそのCookieが提出 されます。
ブラウザから送信されるCookieデータは、複数のデータがある場合でも ひとつにまとめられて、ひとつの環境変数 HTTP_COOKIE に格納されます。 CGIからはこの環境変数を通じてCookieを受信することができます。
この時、ポインタ cookiesが指す領域には例えば次のようにデータが 格納されています。char* cookies = getenv("HTTP_COOKIE");
name1=value1; name2=value2; s=localhost1234567890この例では最初から2つの項がこのCGIが受信すべく設定されたCookieデータ です。続く項は利用しません。また、他人が設定したCookieがさらに後ろに 紛れ込むことがあります。
このデータを容易に利用できるように処理するのですが、FORMの時のように 大がかりなことをする必要はないでしょう。一般にCookieは決まった形式で やりとりされるからです。なので、ここは単純にsscanf関数で間に合います。
sscanf( cookies, "name1=%[^;]; name2=%[^;];", value1, value2 );これでCookieデータを利用できます。
最後にCookieの利点について少し紹介します。
個人データファイルをサーバーからクライアントに移すことによって
サーバー側のデータ管理を大幅に削減することができ、
CGIの負担が劇的に軽くなります。
また、どの個人かを調べる必要がまったく無いので、IDやPasswordによる
認証が必要無くなります。そのためシステムを単純化できまし、閲覧者
にとっても便利です。