CGI::Session

[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 で使えるキーとその意味は次の通り。

"session_path"

クッキーのpathとして使われる. (default: File::dirname(ENV["SCRIPT_NAME"]), スクリプトのURIのpath部の最後のスラッシュまで)

"session_key"

クッキーと<FORM type=hidden>のnameとして使われる. (default: "_session_id")

"session_id"

セッションIDとして使われる. デフォルトのデータベースであるFileStoreを用いる場合, 値は英数字だけからなる文字列で無ければならない. このオプションが指定するとリクエストにセッションIDが含まれても無視される. (default: ランダムに生成される)

"new_session"

値がtrueのとき強制的に新しいセッションを始める. このオプションが指定するとリクエストにセッションIDが含まれても無視される. (default: false)

"database_manager"

データベースクラス. (defalut: CGI::Session::FileStore)

"tmpdir"

CGI::Session::FileStore がセッションデータを作成するディレクトリの名前. (default: ENV["TMP"] || "/tmp")

"prefix"

CGI::Session::FileStore がセッションデータのファイル名に与えるプレフィックス. (default: "")

セッション情報を記録する

session['name'] = "rubikitch"

CGI::SessionオブジェクトはHashのようなものであり、キーに対応する値を記録する。

セッション情報を得る。

name = session['name']

別なCGIでこのセッション情報を取り出すときは、このようにする。

ヘッダ出力

ヘッダ出力はCGI#out、CGI#headerを使っている限り、通常通りで構わない。 cgi/session.rbは内部的にクッキーを使用しているが、これらのメソッドが面倒を見てくれるので、意識をする必要はない。

umask値

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

参考URL


*1るびきち:いい表現ない?