[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るびきち:いい表現ない?