at posts/single.html

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>|

関連する日記