[Gauche-devel-jp] Re: www.cgi-session

Back to archive index

Makoto Satoh makot****@yahoo*****
2004年 9月 3日 (金) 10:32:06 JST


佐藤です.

--- Shiro Kawai <shiro****@lava*****> からのメッセージ:
> セッション管理は、アプリによって要求が結構異なるので、
> アプリ毎に書いてしまった方が速いかなと思って今まで作って
> いませんでした。それと、使いまわしが出来るほどちゃんと
> 作るのは結構難しいので。でもうまい具合にコモンケースが
> 括り出せるならモジュール化してしまっても良いでしょうね。

簡単なCGIを書いているときに,関数化してしまえば良いとは言え,
Distribution付属のしっかりしたモジュールがあると安心だなと
いうのが動機なんです.いつまでもそれだからスキルが向上しない
のかも知れない(自爆).

> ちなみに、既存のセッション管理の仕組みでは、次のような
> 問題はどんなふうにハンドリングされているのでしょうか:
> 
> * 「Backボタン」問題:sessionオブジェクトへの操作が
>   破壊的である場合、ユーザがBackボタンで操作前の画面に
>   戻った時に、正しく状態が巻き戻せない


最近,PerlのCGI::Frameworkを色々調べています.このモジュールは,
CGI.pm,CGI::Session,HTML::Templateをうまく使っていると思います.
このCGI::Frameworkのコンストラクタに渡すオプションに,
disable_back_buttonがあります.

disable_back_buttonに真の値を指定すると,単にキャッシュさせないように
するだけのようです.

  print "Content-type: $content_type\n";
  if ($self->{disable_back_button}) {
      print "Cache-control: no-cache\n";
      print "Pragma: no-cache\n";
      print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n";
  }

さらに,CGI::Frameworkではセッションオブジェクトに,最後にクライアントに
送り返したテンプレートの名前を覚えさせています.

> * 「Clone」問題:操作の途中で、ユーザがそのurlを別画面で
>   開いたりして、双方で別々の操作を続けた場合、cookieだけに
>   よるセッション管理では、両方の操作を別のものとして追うことが
>   できない。

この問題は今まで意識したことないのですが,PerlのCGI::Sessionでは
解決されていないと思います.ちょっと回避方法は思いつきません.

> * Expiration:永続プロセスの無いcgiの場合、たまってゆく
>   永続セッションオブジェクトをどういうタイミングでexpireすべきか

例えば,PerlのCGI::Sessionのデフォルトのセッションデータの格納方法は
プレーンファイルで,そのファイルを作るディレクトリをコンストラクタで
指定しますが,それらのファイルを消すロジックのことですよね?

CGI::Sessionのデストラクタからflush()というメソッドが呼ばれ,
セッションオブジェクトが内部的に持っている_STATUSというフラグが
DELETEDだと,remove()が呼ばれます.このremove()はセッションデータの
ストレージ(ドライバ)で実装されます.デフォルトのFile.pmでは単に
unlink()するだけです.

この_STATUSがDELETEDになるのは,セッションオブジェクトにアクセスが
あると毎回内部に持っている時刻データと指定されたexpiredが比較され,
expireされるべきオブジェクトの場合は,DELETEDにセットされます.








Gauche-devel-jp メーリングリストの案内
Back to archive index