セッション作成で色々な不安はあるものの、正直何が正しいのわからんのでこのまま進む。
前回作成したACMN.pmに次のメソッドを追記する。
#セッションの有効判定
#in1 :データセット名 (未設定を想定)
#in2 :セッションID
#in3 :セッション情報の作成DIR (未設定を想定)
#out1:セッションIDの有効/無効判定 'OK'/'NG'
sub ACMN_checkSession{
$Xml = CMN::CMN->new();
my $class = shift;
my %args = (Dsn => undef,
Sid => undef,
Dir => $Xml->CMN_getXmlElement(Xml => $XmlPath, Node => 'ACMN/Session/Dir'), @_);
my $args = \%args;
my $ret = 'NG:GET_SESSION';
#引数からセッションの検索+_SESSION_ATIME(最終アクセス時刻)の更新
$session = CGI::Session->load($args{Dsn},
$args{Sid},
{Directory=>$args{Dir}}
);
#Cookieに保存されたセッションIDをとりだす
my $cgi=CGI->new;
my $sid=$cgi->cookie('CGISESSID');
#比較する
if($sid eq $session->id){
#OK
$ret = 'OK';
}else{
#NG
my $ret = 'NG:NOT_MATCH_SID';
}
return $ret;
}
今回のメソッドはSid だけが引数として渡されてくるものと想定して作った。
キモになるのは
CGI::Session->load
というメソッドだ。引数からして CGI::Session->newと変わらんがなと思う人もいるだろう。
実はloadじゃなくてnewでもセッションの有効判定は可能である。
いろんな人のブログを覗き見ると、newで有効判定をしている人も見かけた。
しかし、newでやると無効なセッションIDだったときに新しくセッションファイルを作成してしまうので、後で不要なセッションファイルを削除しなければならなくなる。
んなところで無駄なIOを増やしたくないし、変なバグをはらむ危険があるのでそれはナシ。
ちなみにこのloadで検索にひっとしたセッションファイルは_SESSION_ATIME(最終アクセス時刻)が更新される。
さらにちなみにこの時刻は
'_SESSION_ATIME' => 1420202716
というふうに記述されている。つまりある基準日からの経過秒数であり、2038年問題みたいなことが起きる可能性がある。
しらんがな
次にCGIのインスタンスを作成し、
$sid=$cgi->cookie('CGISESSID');
でCookieに設定されているであろうセッションIDを取り出す。
別にCookieに限らず、Cookieになかったら画面遷移時のパラメータを漁るという書き方もできるのだが・・・(PerlDocではそれが推奨)
今はそうする予定はないのでCookieのみとする。
あとはそれぞれのセッションIDを比較し、結果を返す。
・・・この結果の返し方に不満がある人もきっといるだろう。
0とか9とかのがカッコええがな!っていう具合に。
俺もできればTrueかFalseのがいいと思ったがPerlにはないじゃないか!
しかも0とか9とかのコードにして後からみて分かるというのか?いいやわかるまい!
規約で縛ればいいだと・・・?私にとって未知の領域であるPerlの規約なんてわからんのだ!
・・・という理由で素直に'OK'とかを返すようにした。
次でようやく画面遷移にくみこむとする・・・!