CGIの言語がPerlであるWebサーバ(ここでは@homepageが対象)に対して、Sessionを用いたAjaxとの連携について、覚書を記す。
- Sessionの機能は、Walrus::Session::Liteモジュールを使って実現する。(使い方は、リンクを参照のこと)
- クライアントにSession IDを渡すのはCookieを使う。CookieはCGIモジュールを使って実現する。
- クライアント(Ajax=XMLHttpRequest)に渡すヘッダに、以下のようにCookieを使ってSession IDを設定する。
print $cgi->header(-charset=>'UTF-8',-cookie=>$cgi->cookie(-name=>'CGISESSID', -value=>$session_id));
- Sessionを作るCGIと使用するCGIを一つのファイルで兼用する場合、CookieからSession IDを受け取って、それに対するSessionが存在するか見る。ないなら作る。
※:下記のPerlプログラムは動作確認していません。
#!/usr/local/bin/perl
BEGIN { unshift(@INC, "/cgi-bin/libs"); }
use strict;
use CGI;
use Walrus::Session::Lite;
my %session;
my $data;
my $cgi=CGI->new;
my $session_id=$cgi->cookie('CGISESSID')||$cgi->param('CGISESSID')||undef;
my $session_obj = tie(%session, 'Walrus::Session::Lite', './.session', $session_id);
my $sid = $session{'_session_id'};
if(defined $sid && $sid eq $session_id){
#Sessionがあるときの処理
$data = $session{'DATA'};
} else {
#Sessionがないときの処理
$session_obj = tie(%session, 'Walrus::Session::Lite', './.session');
$session_id = $session{'_session_id'};
$data = 'TEST';
$session{'DATA'} = $data;
}
print $cgi->header(-charset=>'UTF-8',
-cookie=>$cgi->cookie(-name=>'CGISESSID',
-value=>$session_id)),
$cgi->start_html(-lang=>'ja',
-encoding=>'UTF-8',
-title=>'test'),
$cgi->p('DATA='.$data.'<br/>'),
$cgi->end_html;
- クライアント側では受け取ったCookieをdocument.cookieで参照する。Cookieを参照する分にはAjaxだからと言って特別なことはない。
- クライアントでCookieから参照したSession IDをXMLHttpRequest()でサーバにリクエストと共に投げる場合は、prototype.jsなら、以下のように、第二引数のうちのparametersにrequestHeaders:を用いてCookieを設定する。
new Ajax.Request(
mapURL,
{method: 'get',
asynchronous:true,
onComplete:getData,
parameters:bearings, requestHeaders:['CGISESSID',session_id]});
こんなところかな?
あー、あと、Ajax.Request()の第二引数のうちのasynchronous:はtrueしか設定できないようだけど、どうなのよ?初め同期にしたかったからfalseにしていたけど、全然CallBack関数を呼んでくれなくて悩んだよ。asynchronous:を省略したTPでは動いていたので気付いたんだけどさ。
最近のコメント