記事を4つも消費する長い道のりであった・・・
ここでようやく遷移元、遷移先にセッションを組み込めるようになった・・・
といっても共通部品で片付けているところが大きいのでそんなでもない。
早速示す↓
#!"C:\Perl64\bin\perl.exe"
#use utf8;
use CGI::Carp qw(fatalsToBrowser);
use CGI;
use lib './CMN/DCMN';
use CMN::DCMN::DCMN;
use lib './CMN/ACMN';
use CMN::ACMN::ACMN;
my $dcmn = CMN::DCMN::DCMN->new();
my $acmn = CMN::ACMN::ACMN->new();
my $cookieId;
$cgi = CGI->new();
$uname = $cgi->param('uname');
$upass = $cgi->param('upass');
$dbh = $dcmn->DCMN_connect() or die "$!";
$sql = "SELECT "
. "COUNT(mstm_user_id) "
."FROM "
. "sato.mstm_user "
."WHERE "
. "user_id = ? "
."AND "
. "user_pass = ? "
."AND "
. "enable_kbn = 1 "
."AND "
. "del_l_flg = 0 "
;
$sth = $dbh->prepare($sql);
$sth->execute("$uname", "$upass");
@result = $sth->fetchrow_array;
#ここからセッション管理↓↓↓
if ((@result[0] eq 1) ) {
#OK
#セッションを作成
$cookieId = $acmn->ACMN_createSession();
#Cookieに書き込みつつログイン成功画面に遷移
print $cgi->header(-location => './testOK2.cgi', -charset=>'UTF-8', -cookie=>$cgi->cookie(-name=>'CGISESSID',-value=>$cookieId));
} else {
#NG
#ログイン画面に戻る
print $cgi->header(-location => '../Login2.html');
}
$dbh->disconnect;
肝心なのはDBでPassチェックが終わってからの
if ((@result[0] eq 1) ) {~
以降のみなのでそこから解説。
つっても
$cookieId = $acmn->ACMN_createSession();
でセッションを作成してIDを取得。
print $cgi->header(-location => './testOK2.cgi', -charset=>'UTF-8', -cookie=>$cgi->cookie(-name=>'CGISESSID',-value=>$cookieId));
で次の画面(testOK2.cgi)に遷移しつつCookieにIDを設定
これだけだ。
まあ、注意することと言ったら、Cookieへの書き込みタイミングだけだろう。
画面遷移のタイミングでレスポンスにまぜて書きこむので、上記
print $cgi->header~
よりも前にCookieを探しても何も拾えない。
っていうかCookieへの書き込みと読み出しを1トランザクション(言い方あってる?)でやるのはとても良くない予感がする。
遷移元はこの程度にして、遷移先を示す↓
#!"C:\Perl64\bin\perl.exe"
#use utf8;
use CGI::Carp qw(fatalsToBrowser);
use CGI;
use lib './CMN/ACMN';
use CMN::ACMN::ACMN;
my $acmn = CMN::ACMN::ACMN->new();
#Cookieに保存されたセッションIDをとりだす
my $cgi=CGI->new;
my $sid=$cgi->cookie('CGISESSID');
#セッションIDのチェック 'OK'/'NG*'で帰ってくる
$chkSid = $acmn->ACMN_checkSession(Sid => $sid);
#セッションIDのチェック
if ($chkSid eq 'OK'){
#OK
print $cgi->header(-type=>'text/html', -charset=>'UTF-8');
print $cgi->start_html(-title=>'ログインOK',-lang=>'ja');
print '<br>Congratulation!!';
print $cgi->end_html();
}else{
#NG
#ログイン画面に戻る
print $cgi->header(-location => '../Login2.html');
}
共通部品化がいい感じに働いていて、
$sid=$cgi->cookie('CGISESSID');
でCookieからとってきたセッションIDを
$chkSid = $acmn->ACMN_checkSession(Sid => $sid);
に渡してチェック結果を受け取るだけ。
動かしてみる。
ID/Passを入力して・・・
おめでたくなる。
10分以内にこのURLに直接アクセスしても・・・
おめでたくなる!
また10分以内にセッションファイルを削除して
URLに直接アクセスすると・・・
ログイン画面に戻される。
というわけでセッション管理に関してはこれでOK
ではなく、セッションファイルの削除を考える。
・・・セッション管理をDBでやれば簡単なんだけどね・・・
まあそこはまだそんな大がかりなもの考えてないからいいや
