類別 CGI::Session::FileStore

基於檔案的會話儲存類別。

將會話儲存實作為「key=value」值的平面檔案。此儲存類型僅與 String 值直接搭配使用;使用者負責在儲存時將其他類型轉換為字串,在擷取時則從字串轉換。

公開類別方法

new(session, option={}) 按一下以切換原始碼

建立新的 FileStore 實例。

此建構函式由 CGI::Session 內部使用。使用者通常不需要直接呼叫它。

session 是為其建立此實例的會話。會話 ID 只能包含字母數字字元;自動產生的會話 ID 會遵守此需求。

option 是初始化函式的選項雜湊。識別下列選項

tmpdir

用於儲存 FileStore 檔案的目錄。預設為 Dir::tmpdir(在 Unix 系統上通常為「/tmp」)。

prefix

在產生此會話的 FileStore 檔案的檔案名稱時,要新增到會話 ID 的字首。預設為「cgi_sid_」。

suffix

在產生此會話的 FileStore 檔案的檔案名稱時,要新增到會話 ID 的字尾。預設為空字串。

如果此會話的 FileStore 檔案不存在,系統會建立它;如果存在,系統會開啟它。

# File lib/cgi/session.rb, line 416
def initialize(session, option={})
  option = {'prefix' => 'cgi_sid_'}.update(option)
  @path, @hash = session.new_store_file(option)
end

公開實例方法

close() 按一下以切換原始碼

更新並關閉會話的 FileStore 檔案。

# File lib/cgi/session.rb, line 463
def close
  update
end
delete() 按一下以切換原始碼

關閉並刪除會話的 FileStore 檔案。

# File lib/cgi/session.rb, line 468
def delete
  File::unlink @path+".lock" rescue nil
  File::unlink @path+".new" rescue nil
  File::unlink @path rescue nil
end
restore() 按一下以切換來源

從會話的 FileStore 檔案還原會話狀態。

以雜湊方式傳回會話狀態。

# File lib/cgi/session.rb, line 424
def restore
  unless @hash
    @hash = {}
    begin
      lockf = File.open(@path+".lock", "r")
      lockf.flock File::LOCK_SH
      f = File.open(@path, 'r')
      for line in f
        line.chomp!
        k, v = line.split('=',2)
        @hash[CGI.unescape(k)] = Marshal.restore(CGI.unescape(v))
      end
    ensure
      f&.close
      lockf&.close
    end
  end
  @hash
end
update() 按一下以切換來源

將會話狀態儲存到會話的 FileStore 檔案。

# File lib/cgi/session.rb, line 445
def update
  return unless @hash
  begin
    lockf = File.open(@path+".lock", File::CREAT|File::RDWR, 0600)
    lockf.flock File::LOCK_EX
    f = File.open(@path+".new", File::CREAT|File::TRUNC|File::WRONLY, 0600)
    for k,v in @hash
      f.printf "%s=%s\n", CGI.escape(k), CGI.escape(String(Marshal.dump(v)))
    end
    f.close
    File.rename @path+".new", @path
  ensure
    f&.close
    lockf&.close
  end
end