2024年6月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

 

« 今日は一日『ハードロック・ヘビーメタル』三昧 | トップページ | 覚書:PerlとAjaxの連携 の続きというか愚痴というか »

2007年10月 9日 (火)

覚書:PerlとAjaxの連携

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では動いていたので気付いたんだけどさ。

« 今日は一日『ハードロック・ヘビーメタル』三昧 | トップページ | 覚書:PerlとAjaxの連携 の続きというか愚痴というか »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 覚書:PerlとAjaxの連携:

« 今日は一日『ハードロック・ヘビーメタル』三昧 | トップページ | 覚書:PerlとAjaxの連携 の続きというか愚痴というか »