ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

Perlでセッションを使う その2:クッキーを使わず、POSTやGETでセッションIDを渡す

2007-04-18 13:40:28 | Weblog

 昨日、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
この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« YouTubeにまもなくフィルタリ... | トップ | 開発の初めから順番に書いて... »
最新の画像もっと見る

Weblog」カテゴリの最新記事