HTTP协议是无状态协议。但对于一个商业网站,它需要保持不同的页面间的会话信息。
如用户在网站注册过程中需要跳转页面,但又要保证之前填写的信息不丢失。
这种情况下 Cookie
很好的帮我们解决了问题。
Cookie 是如何工作的?
几乎所有的网站设计者在进行网站设计时都使用了Cookie
,因为他们都想给浏览网站的用户提供一个更友好的、人文化的浏览环境,同时也能更加准确地收集访问者的信息。
写入和读取
Cookies
集合是附属于Response
对象及Request
对象的数据集合,使用时需要在前面加上Response
或Request
。
用于给客户机发送Cookies
的语法通常为:
-
当给不存在的
Cookies
集合设置时,就会在客户机创建,如果该Cookies
己存在,则会被代替。由于Cookies
是作为HTTP
传输的头信息的一部分发给客户机的,所以向客户机发送Cookies
的代码一般放在发送给浏览器的HTML
文件的标记之前。 -
如果用户要读取
Cookies
,则必须使用Request
对象的Cookies
集合,其使用方法是: 需要注意的是,只有在服务器未被下载任何数据给浏览器前,浏览器才能与Server
进行Cookies
集合的数据交换,一旦浏览器开始接收Server
所下载的数据,Cookies
的数据交换则停止,为了避免错误,要在程序和前面加上response.Buffer=True
。
集合的属性
- 1.
Expires
属性:此属性用来给Cookies
设置一个期限,在期限内只要打开网页就可以调用被保存的Cookies
,如果过了此期限Cookies就自动被删除。如: 设定Cookies的有效期到2004年4月1日,到时将自动删除。如果一个Cookies没有设定有效期,则其生命周期从打开浏览器开始,到关闭浏览器结束,每次运行后生命周期将结束,下次运行将重新开始。 - 2.
Domain
属性:这个属性定义了Cookies
传送数据的唯一性。若只将某Cookies
传送给_blank">
搜狐主页时,则可使用如下代码: - 3.
Path
属性:定义了Cookies
只发给指定的路径请求,如果Path
属性没有被设置,则使用应用软件的默认路径。 - 4.
Secure
属性:指定Cookies
能否被用户读取。 - 5、
Name=Value
:Cookies
是以键值对的形式进行设置和检索的。
Ruby 中处理Cookies
你可以创建一个名为 cookie
的对象并存储文本信息,将该信息发送至浏览器,调用 CGI.out
设置cookie
的头部:
实例
#!/usr/bin/ruby
require "cgi"
cgi = CGI.new("html4")
cookie = CGI::Cookie.new('name' => 'mycookie',
'value' => 'Zara Ali',
'expires' => Time.now + 3600)
cgi.out('cookie' => cookie) do
cgi.head + cgi.body { "Cookie stored" }
end
接下来我们回到这个页面,并查找cookie
值,如下所示:
实例
#!/usr/bin/ruby
require "cgi"
cgi = CGI.new("html4")
cookie = cgi.cookies['mycookie']
cgi.out('cookie' => cookie) do
cgi.head + cgi.body { cookie[0] }
end
CGI::Cookie
对象实例化时包含以下参数:
参数 | 描述 |
---|---|
name | 规定 cookie 的名称 |
value | 规定 cookie 的值。 |
expire | 规定 cookie 的有效期。 |
path | 规定 cookie 的服务器路径。 |
domain | 规定 cookie 的域名。 |
secure | 规定是否通过安全的 HTTPS 连接来传输 cookie。 |
Ruby CGI Session
CGI::Session
可以为用户和CGI
环境保存持久的会话状态,会话使用后需要关闭,这样可以保证数据写入到存储当中,当会话完成后,你需要删除该数据。
实例
#!/usr/bin/ruby
require 'cgi'
require 'cgi/session'
cgi = CGI.new("html4")
sess = CGI::Session.new( cgi, "session_key" => "a_test",
"prefix" => "rubysess.")
lastaccess = sess["lastaccess"].to_s
sess["lastaccess"] = Time.now
if cgi['bgcolor'][0] =~ /[a-z]/
sess["bgcolor"] = cgi['bgcolor']
end
cgi.out{
cgi.html {
cgi.body ("bgcolor" => sess["bgcolor"]){
"The background of this page" +
"changes based on the 'bgcolor'" +
"each user has in session." +
"Last access time: #{lastaccess}"
}
}
}
访问"/cgi-bin/test.cgi?bgcolor=red"
将跳转到指定背景颜色的页面。
会话数据存在在服务器的临时文件目录中,prefix
参数指定了会话的前缀,将作为临时文件的前缀。这样你在服务器上可以轻松的识别不同的会话临时文件。
CGI::Session 类
CGI::Session
保持了用户与CGI
环境的持久状态。 会话可以在内存中,也可以在硬盘上。
类方法
Ruby
类 Class CGI::Session
提供了简单的方法来创建 session
:
CGI::Session::new( cgi[, option])
启用一个新的 CGI
会话并返回相应的CGI::Session
对象。选项可以是可选的哈希,可以是以下值:
session_key
: 键名保存会话 默认为_session_id
。session_id
: 唯一的会话ID
。自动生成new_session
: 如果为true
,为当前会话创建一个新的Session id
。 如果为* false
, 通过session_id
使用已存在的session
标识。 如果省略该参数,如果可用则使用现有的会话,否则创建一个新的。database_manager
: 用于保存sessions
的类,可以是CGI::Session::FileStore or CGI::Session::MemoryStore
。默认为FileStore
。
*tmpdir
: 对于FileStore
, 为session
的错存储目录。prefix
: 对于FileStore
, 为session
文件的前缀。
实例化方法
序号 | 方法描述 |
---|---|
1 | [ ]返回给定 key 的值。查看实例。 |
2 | [ ]=设置给定 key 的值。 查看实例。 |
3 | delete调用底层数据库管理的删除方法。对于 FileStore, 删除包含 session 的物理文件。 对于 MemoryStore, 从内存中移除 session 数据。 |
4 | update调用底层数据库管理的更新方法。 对于 FileStore, 将 session 写入到磁盘中。 对于 MemoryStore则无效果。 |