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 をプリントしたりして、だいぶ彷徨いました。