本文簡要介紹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 Session.new用法及代碼示例
- Ruby Set flatten()用法及代碼示例
- Ruby Set.replace用法及代碼示例
- Ruby Set intersection()用法及代碼示例
- Ruby Set類用法及代碼示例
- Ruby Set.==用法及代碼示例
- Ruby Set.disjoint?用法及代碼示例
- Ruby Set size()用法及代碼示例
- Ruby Set compare_by_identity?用法及代碼示例
- Ruby Set merge()用法及代碼示例
- Ruby Set.classify用法及代碼示例
- Ruby Set add?用法及代碼示例
- Ruby Set compare_by_identity()用法及代碼示例
- Ruby Set flatten!()用法及代碼示例
- Ruby Set divide()用法及代碼示例
- Ruby Set replace()用法及代碼示例
- Ruby Set.[]用法及代碼示例
- Ruby Set.===用法及代碼示例
- Ruby Set include?()用法及代碼示例
- Ruby Set subtract()用法及代碼示例
- Ruby Set member?()用法及代碼示例
- Ruby Set intersect?()用法及代碼示例
- Ruby Set proper_subset?()用法及代碼示例
- Ruby Set difference()用法及代碼示例
- Ruby Set.-用法及代碼示例
注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Session類。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。