Ruby 2.4

CGI::Session::FileStore

class CGI::Session::FileStore

Parent:Object

基于文件的会话存储类。

将会话存储实现为'key = value'值的平面文件。此存储类型只能直接使用字符串值; 用户负责在存储时将其他类型转换为字符串,并在检索时将字符串转换为字符串。

公共类方法

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文件不存在,则会创建该会话的FileStore文件,如果该文件不存在,则会打开该文件

# File lib/cgi/session.rb, line 374 def initialize(session, option={}) dir = option['tmpdir'] || Dir::tmpdir prefix = option['prefix'] || 'cgi_sid_' suffix = option['suffix'] || '' id = session.session_id require 'digest/md5' md5 = Digest::MD5.hexdigest(id)[0,16] @path = dir+"/"+prefix+md5+suffix if File::exist? @path @hash = nil else unless session.new_session raise CGI::Session::NoSession, "uninitialized session" end @hash = {} end end

公共实例方法

close() 显示源

更新并关闭会话的FileStore文件。

# File lib/cgi/session.rb, line 434 def close update end

delete() 显示源

关闭并删除会话的FileStore文件。

# File lib/cgi/session.rb, line 439 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 395 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 unless f.nil? lockf.close if lockf end end @hash end

update() 显示源

将会话状态保存到会话的FileStore文件。

# File lib/cgi/session.rb, line 416 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 if f lockf.close if lockf end end