Ruby の CGI::Session (2)
2006-06-22
先日の日記の続き。 Ruby の CGI クラスに手を入れて、簡単にセッションを扱えるようにしてみた。
セッション情報の読込
cgi = CGI.new
if cgi.session && cgi.session['user']
puts "ログインしています"
else
puts "ログインしていません"
end
セッション Cookie があれば、CGI.new した時点で自動的に読み込むようにしている。 Cookie が無ければ、新規に発行したりはしない。
セッションの発行
セッションを新規に発行するには、 create_session メソッドを使う。
cgi.create_session
cgi.session['user'] = user
puts "ログインしました"
すでにセッション Cookie を持っていた場合は、それを破棄して新しいセッションを作るようになる。
セッションの削除
セッションを削除するには、 delete_session メソッドを使う。
cgi.delete_session
puts "ログインしました"
元々セッションが無くてもエラーにはならないようにしている。
ソース
#!/usr/bin/env ruby
require 'cgi'
require 'cgi/session'
class CGI::Session
# create new session
def self.create(request, options = {})
session = self.read(request, options)
session.delete if session
options['new_session'] = true
CGI::Session.new(request, options)
end
# read session if exist
def self.read(request, options = {})
options['new_session'] = false
begin
CGI::Session.new(request, options)
rescue ArgumentError # if no old session
end
end
end
class CGI
attr_accessor :session
alias :initialize_orginal :initialize
def initialize(*args)
initialize_orginal(*args)
@session = CGI::Session.read(self)
end
def create_session
@session = CGI::Session.create(self)
end
def delete_session
@session.delete if @session
@session = nil
end
def session_id
@session ? @session.session_id : ''
end
end
サンプルコード
#!/usr/bin/env ruby
require 'cgi'
require 'cgi/session'
cgi = CGI.new
message = []
message << "read session. ID: #{cgi.session_id}" if cgi.session
if cgi['session'] == 'create'
cgi.create_session
message << "create session. ID: #{cgi.session_id}"
cgi.session['counter'] = ""
elsif cgi['session'] == 'delete'
message << "delete session. ID: #{cgi.session_id}"
cgi.delete_session
elsif cgi.session
cgi.session['counter'] << "+"
message << "counter: #{cgi.session['counter']}"
else
message << "you don't have a session."
end
puts cgi.header
puts %Q|<html><body>|
puts %Q|<a href="?">reload</a>|
puts %Q|<a href="?session=create">create</a>|
puts %Q|<a href="?session=delete">delete</a>|
puts %Q|<pre style="border: solid 1px #888; padding: 1em">#{message.join("\n")}</pre>|
puts %Q|</body></html>|