CGI.pmを使ってCookieを利用する方法

CGIテクニック集トップへ





概要

CGI.pmを使ってCookie(クッキー)の設定、読み込みをする方法です。 メッセージボード5などCookieを使っている所で利用しています。 CGI.pmを使わない方法は、CGI.pmを使わずにCookieを利用する方法を参照してください。

必用な処理

  1. PerlのPackage、CGI.pmを読み込む
  2. CGIのオブジェクトを作成する
  3. cookieメソッドでクッキーのフォーマットを作成する
  4. path=の記述を除去する
  5. httpヘッダに出力する
  6. 読み込む際にはcookieメソッドで読み込む

サンプルコード

 use CGI;
 
 my $q = CGI->new;
 
 my $text = '日本語文字列';
 
 # Cookie設定
 my $cookie = $q->cookie(-name    => "mycookie",
                         -value   => "$text",
                         -expires => "+1y");
 $cookie = &cookie_path_fix($cookie);
 print $q->header(-type=>'text/html', -cookie=>"$cookie");
 
 # Cookie読み込み
 my $readcookie = $q->cookie("mycookie");
 
 sub cookie_path_fix {
     my $a = shift;
     $a =~ s/path\s*=\s*[^;]*;//i;
     return $a;
 }

コードの解説

 use CGI;

CGI.pmを読み込みます。

 my $q = CGI->new;

CGIのオブジェクトを作成します。

 my $text = '日本語文字列';

この例ではこの「日本語文字列」という単語をCookieに登録します。

 # Cookie設定
 my $cookie = $q->cookie(-name    => "mycookie",
                         -value   => "$text",
                         -expires => "+1y");

cookieメソッドでCookieで登録する書式を作成します。-nameはクッキー名、-valueは登録する文字列。-expiresはクッキーの有効期限です。-expireは

        +30s                                30秒
        +10m                                10分
        +1h                                 1時間
        -1d                                 昨日(今すぐ)
        now                                 今
        +3M                                 3ヶ月
        +10y                                10年
        Thursday, 25-Apr-1999 00:40:33 GMT  記述した日時

の値を取ります。

 $cookie = &cookie_path_fix($cookie);

cookieメソッドで作成されたクッキーの書式からpath=の部分を取り除きます。pathの項目は本来あるべき物なのですがこれがあるとクッキーが正常に働きませんでしたので取り除きます。cookie_path_fixのルーチンは後で記述しています。この時点で「日本語文字列」という文字列はURIエンコードされていますので「%93%FA%96%7B%8C%EA%95%B6%8E%9A%97%F1」のようになってこのエンコードされた文字列を実際にクッキーに登録することになります。

 print $q->header(-type=>'text/html', -cookie=>"$cookie");

HTTPヘッダをSet-Cookieと共に出力します。この部分は、

 print "Set-Cookie: $cookie\n";
 print "Content-Type: text/html\n\n";

これと等価になります。厳密には等価じゃないかもしれませんが動作的には等価です。 以上でクッキーの設定が完了です。ブラウザにはmycookieという名前でクッキーが登録されています。

 # Cookie読み込み
 my $readcookie = $q->cookie("mycookie");

クッキーを読み込む際にもcookieメソッドを使います。この例では$readcookieに「日本語文字列」が入ります。cookieメソッドを使わずに$ENV{HTTP_COOKIE}で値を取るとURIエンコードされたまま取り込まれることになりますので別途デコードする必用があります。

 sub cookie_path_fix {
     my $a = shift;
     $a =~ s/path\s*=\s*[^;]*;//i;
     return $a;
 }

前述したcookie_path_fixルーチンになります。

関連するCGIテクニック

CGI.pmを使わずにCookieを利用する方法