当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby Session类用法及代码示例


本文简要介绍ruby语言中 CGI::Session类 的用法。

概述

此文件提供 CGI::Session 类,该类为 CGI 脚本提供会话支持。会话是链接在一起并与单个客户端相关联的一系列 HTTP 请求和响应。与会话相关的信息在请求之间存储在服务器上。每个请求和响应都会在客户端和服务器之间传递会话 ID,对用户透明。这会将状态信息添加到原本无状态的 HTTP 请求/响应协议中。

生命周期

CGI::Session 实例是从 CGI 对象创建的。默认情况下,如果当前不存在,则此 CGI::Session 实例将启动一个新会话,如果存在,则继续此客户端的当前会话。 new_session 选项可用于始终或从不创建新会话。有关详细信息,请参阅new()。

delete() 从会话存储中删除会话。但是,它不会从客户端删除会话 ID。如果客户端使用相同的 id 发出另一个请求,效果将是使用旧会话的 id 启动一个新会话。

设置和检索会话数据。

Session 类将数据与会话关联为键值对。可以通过使用“[]”索引 Session 实例来设置和检索此数据,这与哈希非常相似(尽管不支持其他哈希方法)。

完成请求的会话处理后,应使用close() 方法关闭会话。这会将会话的状态存储到持久存储中。如果您想在不完成此请求的会话处理的情况下将会话的状态存储到持久存储中,请调用 update() 方法。

存储会话状态

调用者可以使用 database_manager 选项指定用于会话数据的存储形式 CGI::Session::new 。以下存储类作为标准库的一部分提供:

CGI::Session::FileStore

将数据作为纯文本存储在平面文件中。仅适用于 String 数据。这是默认存储类型。

CGI::Session::MemoryStore

将数据存储在内存中的哈希中。只要当前的 Ruby 解释器实例存在,数据就会持续存在。

CGI::Session::PStore

以编组格式存储数据。由 cgi/session/pstore.rb 提供。支持任何类型的数据,并提供file-locking和事务支持。

还可以通过使用以下方法定义类来创建自定义存储类型:

new(session, options)
restore  # returns hash of session data.
update
close
delete

更改存储类型mid-session 不起作用。请特别注意,默认情况下 FileStore PStore 会话数据文件具有相同的名称。如果您的应用程序从一个切换到另一个,而没有确保文件名会有所不同,并且客户端仍然在 cookie 中保留旧会话,那么事情将会非常糟糕!

维护会话 ID。

大多数会话状态都在服务器上维护。但是,会话 id 必须在客户端和服务器之间来回传递,以维护对该会话状态的引用。

最简单的方法是通过 cookie。如果客户端启用了 cookie, CGI::Session 类通过 cookie 为会话 id 通信提供透明支持。

如果客户端禁用了 cookie,则会话 ID 必须作为客户端发送到服务器的所有请求的参数包含在内。 CGI::Session 类连同 CGI 类将透明地将会话ID 作为隐藏输入字段添加到使用CGI#form() HTML 生成方法生成的所有表单中。没有为其他机制提供内置支持,例如 URL 重写。调用者负责从 session_id 属性中提取会话ID,并在URL 中手动对其进行编码,并将其作为隐藏输入添加到由其他机制创建的HTML 表单中。此外,会话到期不会自动处理。

使用示例

设置用户名

require 'cgi'
require 'cgi/session'
require 'cgi/session/pstore'     # provides CGI::Session::PStore

cgi = CGI.new("html4")

session = CGI::Session.new(cgi,
    'database_manager' => CGI::Session::PStore,  # use PStore
    'session_key' => '_rb_sess_id',              # custom session key
    'session_expires' => Time.now + 30 * 60,     # 30 minute timeout
    'prefix' => 'pstore_sid_')                   # PStore option
if cgi.has_key?('user_name') and cgi['user_name'] != ''
    # coerce to String: cgi[] returns the
    # string-like CGI::QueryExtension::Value
    session['user_name'] = cgi['user_name'].to_s
elsif !session['user_name']
    session['user_name'] = "guest"
end
session.close

安全地创建新会话

require 'cgi'
require 'cgi/session'

cgi = CGI.new("html4")

# We make sure to delete an old session if one exists,
# not just to free resources, but to prevent the session
# from being maliciously hijacked later on.
begin
    session = CGI::Session.new(cgi, 'new_session' => false)
    session.delete
rescue ArgumentError  # if no old session
end
session = CGI::Session.new(cgi, 'new_session' => true)
session.close

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Session类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。