Ruby の CGI::Session (2)
先日の日記の続き。 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>|