类 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