[2001/08/26] by るびきち[外部]
CGIのセッション管理を行うライブラリ。 セッションとは、複数回のHTTPリクエストで一連の動作をさせるものである。*1 セッション管理には従来通り、cgi.rbが提供するクッキーを使用してもいいが、このcgi/session.rbを使用した方がよりわかりやすい。 セッション情報はHashライクなインターフェースである。
このcgi/session.rbを使うと、セッション情報はサーバ側で管理し、クライアントにはそのセッション情報に対応するセッションIDをクッキーで渡すことになる。 そのクッキーはexpiresが指定されていないために、ブラウザを終了した時点で消滅する。
cgi = CGI::new session = CGI::Session::new( cgi [, aHash] )
CGI::Session::newにCGIオブジェクトを渡す。
オプション引数 aHash で使えるキーとその意味は次の通り。
クッキーのpathとして使われる.
(default: File::dirname(ENV["SCRIPT_NAME"])
, スクリプトのURIのpath部の最後のスラッシュまで)
クッキーと<FORM type=hidden>のnameとして使われる.
(default: "_session_id"
)
セッションIDとして使われる.
デフォルトのデータベースであるFileStore
を用いる場合, 値は英数字だけからなる文字列で無ければならない.
このオプションが指定するとリクエストにセッションIDが含まれても無視される.
(default: ランダムに生成される)
値がtrueのとき強制的に新しいセッションを始める.
このオプションが指定するとリクエストにセッションIDが含まれても無視される. (default: false
)
データベースクラス.
(defalut: CGI::Session::FileStore
)
CGI::Session::FileStore
がセッションデータを作成するディレクトリの名前.
(default: ENV["TMP"] || "/tmp"
)
CGI::Session::FileStore
がセッションデータのファイル名に与えるプレフィックス.
(default: ""
)
session['name'] = "rubikitch"
CGI::SessionオブジェクトはHashのようなものであり、キーに対応する値を記録する。
name = session['name']
別なCGIでこのセッション情報を取り出すときは、このようにする。
ヘッダ出力はCGI#out、CGI#headerを使っている限り、通常通りで構わない。 cgi/session.rbは内部的にクッキーを使用しているが、これらのメソッドが面倒を見てくれるので、意識をする必要はない。
umask値が0022ならばセッション情報ファイルのパーミッションが644になるので、任意のユーザがそのセッション情報ファイルを見ることができる。 それが嫌な場合はCGI::Sessionオブジェクト生成前にumask値を設定しておこう。
ただ、名前を入力するとあいさつをするだけのつまらないCGI。
デモ会場はこちら[外部]。
#!/usr/bin/ruby require 'kconv' require 'cgi' require 'cgi/session' class SessionDemo def initialize @cgi = CGI::new File.umask(0066) # セッションファイルは誰にも読まれたくないよ @session = CGI::Session::new( @cgi ) # セッションはこうして生成する。 @cmd = @cgi['cmd'].first || 'start' @header = { "type" => "text/html", "charset" => "euc-jp" } __send__("cmd_#{@cmd}") end def cmd_start @cgi.out( @header ) { <<-END <html><head><title>CGI::Session Demo</title></head> <body> <form action="#{ENV['SCRIPT_NAME']}" method="get"> <p> あなたの名前は? <input type="text" name="name"> <input type="hidden" name="cmd" value="hello"> <input type="submit" value="です。"> </p> </form> </body></html> END } end def cmd_hello name = Kconv::toeuc( @cgi['name'].first ) @session['name'] = name # セッションに記憶 @cgi.out( @header ) { # セッション情報は隠れクッキーで保持されるため、CGI#outで出力 <<-END <html><head><title>CGI::Session Demo</title></head> <body> <p>こんにちは、#{name}さん</p> <p><a href="#{ENV['SCRIPT_NAME']}?cmd=bye">[次へ]</p> </body></html> END } end def cmd_bye name = @session['name'] # セッションデータから取り出し @cgi.out( @header ) { <<-END <html><head><title>CGI::Session Demo</title></head> <body> <p>#{name}さん、さようなら</p> <p><a href="#{ENV['SCRIPT_NAME']}">[戻る]</p> </body></html> END } end end SessionDemo.new
*1るびきち:いい表現ない?