當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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類。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。