自転車旅行とWebサービス -2ページ目

自転車旅行とWebサービス

しがないSEが自転車旅行にかまけながら自前Webサービス作成を目指す

セッション作成で色々な不安はあるものの、正直何が正しいのわからんのでこのまま進む。
前回作成した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'とかを返すようにした。



次でようやく画面遷移にくみこむとする・・・!