类 CGI::Session::FileStore

基于文件的会话存储类。

将会话存储实现为“键=值”值的平面文件。此存储类型仅直接适用于 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