昨日、Perlでセッションを使う その1:クッキーを利用(セッションIDを入れる)。というのを書いたので 、今日は、Cookieを使わないで、POSTやGetの引数にセッションIDをセットしてやってみます。
なお、「1:CGI::Sessionを入手する」と、「今回の課題」までは、昨日の話と同じです。
■追加仕様:セッションIDの追加
課題に関しては、昨日とおなじ、
1行目に、セッションIDを表示し、
2行目に、アクセスするたびごとに1あがる
しかし、10になるとセッション自体を削除する
3行目は、とびとびに1が出たり出なかったりする
なのですが、セッションIDを渡すところを追加します。
1回目のアクセスは、それでOK.
2回目にアクセスするときには、URLに、sid=1行目のセッションID
を付けます
たとえば、CGIが、http://127.0.0.1/cgi-bin/sessionTest2だったとし、
1行目に書かれているセッションIDが
1234567890ABCDEF
だったとすると(こんな簡単なIDになることは、絶対ないが。。)
URLは、
http://127.0.0.1/cgi-bin/sessionTest2?sid=1234567890ABCDEF
になる。
10回目で削除されるので、IDが変わったら、次から変わったIDにsidを振りなおして、同様のことをする。
■ソース
このCGIは、以下のとおりです。
セッション関係で、昨日と違うところを赤くしておきます。
#!C:/Perl/bin/perl ################################################# # # # セッションのテスト # # Cookieを利用”しない”場合 # # 引数のsidに設定 # # # ################################################# use CGI; use CGI::Session; ################################# # 必要な変数の取得 # ################################# ##引数を取得 if ( $ENV{'REQUEST_METHOD'} eq "POST" ) { read (STDIN, $qs, $ENV{'CONTENT_LENGTH'}); } else { $qs = $ENV{'QUERY_STRING'}; } @qs = split(/&/,$qs); foreach $i (0 .. $#qs) { ($name, $value) = split(/=/,$qs[$i],2); $value =~ tr/+/ /; #“+”を空白 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $qs{$name} = $value; } ################################# # セッション開始 # ################################# $cgi = new CGI; $session = new CGI::Session($qs{"sid"}); ################################# # セッションの操作 # ################################# #セッションIDを受け取ってみる $sid = $session->id(); #kaisuから値を取得、1足して $kaisu_val = $session->param("kaisu"); $kaisu_val++; #10まできたら、このセッションを消す。10未満なら追加 if ( $kaisu_val == 10 ) { $session->delete(); } else { $session->param("kaisu",$kaisu_val); } #偶数ならtobitobiセット、奇数なら、この項目(のみ)削除 $tobitobi = $session->param("tobitobi"); if ( $kaisu_val %2 == 0 ) { $tobitobi = $session->param("tobitobi",1); } else { $tobitobi = $session->clear("tobitobi"); } #セッションをクローズ ################################# # 出力 # ################################# print "Content-Type: text/plain¥n¥n"; # あとは、内容を好き勝手に書く print "$sid¥n"; print "$kaisu_val¥n"; print "$tobitobi¥n"; |
(上記 < > ¥ は、本当は半角です
Windows上で、ActivePerlを使ってCGIをやってます)
■説明
はじめに、セッションを生成するため、
$cgi = new CGI;
$session = new CGI::Session($qs{"sid"});
とやって、セッションを作ってます。
なお、Cookieのときは、生成するとき、
$session = new CGI::Session("driver:File", $cgi, {Directory=>'./session'});
ってやって、生成してました。
で、いろいろ、操作します。
最後に書き出しですが、セッションをクッキーに入れない場合は、上記のように、普通に書いてくれればいいのですが、クッキーにいれるときは、ヘッダーにその内容を書かないといけません。その場合のヘッダーを、
$header = $session->header();
で作ってくれますので、そのヘッダー($header)を、クッキーを入れる場合は書き出すことになります。
■参考にしたサイト
CPAN
http://search.cpan.org/~markstos/CGI-Session-4.20/lib/CGI/Session.pm
CGI::Session - セッション管理
http://www.ksknet.net/cgi/cgisession.html
Perlメモ/CGI::Sessionモジュール
http://digit.que.ne.jp/work/index.cgi?Perl%E3%83%A1%E3%83%A2%2FCGI%3A%3ASession%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB