ねもぷらす

ふぁいんでぃんぐねもの日記。プログラミングとか育児とか

CGI::Session でセッション管理

やっとこさサンプルが書けましたorz
超単純な話のはずなのに、なぜか cookie の値を読んでくれない。今も $cgi = CGI->new してて、SESSON に丸ごと $cgi 渡してるからなぁ…コレでよいんですか?もっとシンプルなセッションの処理書きたかったんだけど参考になるサイトが見つかっていません。

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

use CGI;
use CGI::Session;
use Apache;
use Data::Dumper;

use constant SESSION_DIR => '/tmp';

eval {
    my $cgi = CGI->new;
    my $session = new CGI::Session( "driver:File", $cgi, {Directory => SESSION_DIR});

    ### ログイン前
    unless ( defined( $session->param('login') ) ) {

        ### ログインモード
        if( 'login' eq $cgi->param('mode') ){
            &login( $cgi, $session ) or die "cannot login";
            print "Content-type: text/html\n\n";
            print "<h1> ---Called ". $cgi->param('mode') ."---</h1>\n";
            print "<PRE>". Dumper( $session ) ."</PRE>"
        }

        ## その他以外
        else {
            print "Content-type: text/html\n\n";
            print "<h1>no login</h1>"
        }
    }

    ### ログイン後
    else {
        print "Content-type: text/html\n\n";
        print "<h1> ---LOGINED NOW---</h1>\n";
        print "<h2>USER NAME = ". $session->param('name') ."</h2>";
        print "<PRE>". Dumper( $session ) ."</PRE>";
    }

    ## ログアウト処理
    if( 'logout' eq $cgi->param('mode') ){
        $session->delete();
        print "<h1>---LOGOUT!---</h1>\n";
    }

};if($@){
    print "Content-type: text/html\n\n";
    print "<h1>ERROR : $@</h1>\n";
}

sub login {
    my $cgi = shift;
    my $session = shift;
    my $username = $cgi->param('name') || 'test_user';

    $session = new CGI::Session("driver:File", $cgi, {Directory => SESSION_DIR}) unless $session;
    $session->expire("+1m");
    $session->param("login", 'login');
    $session->param("name", $username);

    my $cookie = $cgi->cookie(CGISESSID => $session->id);
    my $r = Apache->request;
    my $c = new CGI::Cookie(
                -name    =>  'CGISESSID',
                -value   =>  [$session->id],
                -expires =>  '+1m'
            );
    $r->header_out('Set-Cookie',$c);
    return 1;
}

環境が整ってればすぐ動かせるソース。
loginメソッドで $r->header_out('Set-Cookie',$c) を返す前に Content-type をプリントしたりして、だいぶ彷徨いました。